数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 132|回复: 11

[C51] AI写的万年历代码无法编译

[复制链接]
发表于 昨天 12:22 | 显示全部楼层 |阅读模式
AI写的万年历编译报错,不懂代码,不知道那的问题

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
 楼主| 发表于 昨天 12:23 | 显示全部楼层
  1. #include "STC8H.H"
  2. #include <intrins.h>
  3. #include <string.h>

  4. /*-------- 引脚定义 --------*/
  5. sbit TM1640_1_DIN = P3^7;  // 第一个TM1640数据线
  6. sbit TM1640_1_SCLK = P3^6; // 第一个TM1640时钟线
  7. sbit TM1640_2_DIN = P1^0;  // 第二个TM1640数据线
  8. sbit TM1640_2_SCLK = P1^1; // 第二个TM1640时钟线

  9. sbit KEY_SET = P1^4;      // 设置键
  10. sbit KEY_UP = P1^5;       // 增加键
  11. sbit KEY_DOWN = P1^6;     // 减少键
  12. sbit KEY_BRIGHT = P1^7;   // 亮度键

  13. /*-------- 常量定义 --------*/
  14. #define SETTING_TIMEOUT 150  // 15秒超时(100ms*150)

  15. // 数码管段码表 (共阴)
  16. const unsigned char segCode[] = {
  17.     0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, // 0-9
  18.     0x40,0x00, // '-'和关闭
  19.     0x39,0x5E,0x79,0x71,0x3D,0x76,0x30,0x1E,0x7A,0x38, // 星期1-7
  20.     0x63 // °C
  21. };

  22. /*-------- 系统状态结构体 --------*/
  23. typedef struct {
  24.     // 时间数据
  25.     unsigned int year;
  26.     unsigned char month;
  27.     unsigned char day;
  28.     unsigned char hour;
  29.     unsigned char minute;
  30.     unsigned char second;
  31.     unsigned char weekday;
  32.    
  33.     // 环境数据
  34.     float temperature;
  35.     float humidity;
  36.    
  37.     // 系统状态
  38.     unsigned char brightness;
  39.     unsigned char setting_mode; // 0:正常 1:年 2:月 3:日 4:时 5:分 6:星期
  40.     unsigned char blink_counter;
  41.     unsigned long key_press_time;
  42.     unsigned char inactive_counter;
  43. } SystemState;

  44. SystemState sys;

  45. /*-------- 函数声明 --------*/
  46. void DelayMS(unsigned int ms);
  47. bit KeyPressed(sbit key);
  48. bit KeyLongPressed(sbit key);
  49. void TM1640_SendByte(unsigned char dat, sbit din_pin, sbit sclk_pin);
  50. void TM1640_SetBrightness(unsigned char level, sbit din_pin, sbit sclk_pin);
  51. void TM1640_Display(unsigned char *data, unsigned char len, sbit din_pin, sbit sclk_pin);
  52. void ProcessBlink(unsigned char *displayData, unsigned char pos);
  53. void PrepareDisplayData1(unsigned char *displayData);
  54. void PrepareDisplayData2(unsigned char *displayData);
  55. void AdjustBrightness();
  56. void ProcessTimeSetting();
  57. void UpdateDisplay();
  58. void SystemInit();

  59. /*-------- 函数实现 --------*/
  60. void DelayMS(unsigned int ms) {
  61.     unsigned int i, j;
  62.     for(i=0; i<ms; i++)
  63.         for(j=0; j<114; j++);
  64. }

  65. bit KeyPressed(sbit key) {
  66.     if(key == 0) {
  67.         DelayMS(10);
  68.         if(key == 0) {
  69.             while(!key);
  70.             sys.inactive_counter = 0;
  71.             return 1;
  72.         }
  73.     }
  74.     return 0;
  75. }

  76. bit KeyLongPressed(sbit key) {
  77.     if(key == 0) {
  78.         sys.key_press_time = 0;
  79.         while(key == 0) {
  80.             DelayMS(10);
  81.             sys.key_press_time += 10;
  82.             if(sys.key_press_time >= 5000) {
  83.                 while(!key);
  84.                 sys.inactive_counter = 0;
  85.                 return 1;
  86.             }
  87.         }
  88.     }
  89.     return 0;
  90. }

  91. void TM1640_SendByte(unsigned char dat, sbit din_pin, sbit sclk_pin) {
  92.     unsigned char i;
  93.     for(i=0; i<8; i++) {
  94.         sclk_pin = 0;
  95.         _nop_();
  96.         din_pin = (dat & 0x01);
  97.         _nop_();
  98.         sclk_pin = 1;
  99.         _nop_();
  100.         dat >>= 1;
  101.     }
  102. }

  103. void TM1640_SetBrightness(unsigned char level, sbit din_pin, sbit sclk_pin) {
  104.     if(level < 1) level = 1;
  105.     if(level > 7) level = 7;
  106.    
  107.     din_pin = 1;
  108.     sclk_pin = 1;
  109.     _nop_();
  110.     din_pin = 0;
  111.     _nop_();
  112.    
  113.     TM1640_SendByte(0x40 | (level & 0x07), din_pin, sclk_pin);
  114.    
  115.     din_pin = 0;
  116.     sclk_pin = 0;
  117.     _nop_();
  118.     sclk_pin = 1;
  119.     _nop_();
  120.     din_pin = 1;
  121. }

  122. void TM1640_Display(unsigned char *data, unsigned char len, sbit din_pin, sbit sclk_pin) {
  123.     unsigned char i;
  124.     din_pin = 1;
  125.     sclk_pin = 1;
  126.     _nop_();
  127.     din_pin = 0;
  128.     _nop_();
  129.    
  130.     TM1640_SendByte(0x40, din_pin, sclk_pin);
  131.     TM1640_SendByte(0xC0, din_pin, sclk_pin);
  132.    
  133.     for(i=0; i<len; i++) {
  134.         TM1640_SendByte(data[i], din_pin, sclk_pin);
  135.     }
  136.    
  137.     TM1640_SetBrightness(sys.brightness, din_pin, sclk_pin);
  138. }

  139. void ProcessBlink(unsigned char *displayData, unsigned char pos) {
  140.     if(sys.setting_mode > 0) {
  141.         sys.blink_counter++;
  142.         if(sys.blink_counter >= 10) sys.blink_counter = 0;
  143.         if(sys.blink_counter < 5) {
  144.             displayData[pos] = segCode[0];
  145.             if(pos < 15) displayData[pos+1] = segCode[0];
  146.         }
  147.     }
  148. }

  149. void PrepareDisplayData1(unsigned char *displayData) {
  150.     memset(displayData, 0, 16);
  151.    
  152.     // 月份(GRID1-2)
  153.     displayData[0] = segCode[sys.month/10];
  154.     displayData[1] = segCode[sys.month%10];
  155.    
  156.     // 日(GRID3-4)
  157.     displayData[2] = segCode[sys.day/10];
  158.     displayData[3] = segCode[sys.day%10];
  159.    
  160.     // 时间(GRID5-10)
  161.     displayData[4] = segCode[sys.hour/10];
  162.     displayData[5] = segCode[sys.hour%10];
  163.     displayData[6] = segCode[sys.minute/10];
  164.     displayData[7] = segCode[sys.minute%10];
  165.     displayData[8] = segCode[sys.second/10];
  166.     displayData[9] = segCode[sys.second%10];
  167.    
  168.     // 温度(GRID11-13)
  169.     int tempInt = (int)sys.temperature;
  170.     displayData[10] = segCode[tempInt/10];
  171.     displayData[11] = segCode[tempInt%10] | 0x80; // 第12位数码管DP常亮
  172.     displayData[12] = segCode[(int)(sys.temperature*10)%10];
  173.    
  174.     // 湿度(GRID14-15)
  175.     displayData[13] = segCode[(int)sys.humidity/10];
  176.     displayData[14] = segCode[(int)sys.humidity%10];
  177.    
  178.     // 星期(GRID16)
  179.     displayData[15] = segCode[11 + sys.weekday];
  180.    
  181.     // 设置模式闪烁
  182.     switch(sys.setting_mode) {
  183.         case 2: ProcessBlink(displayData, 0); break; // 月
  184.         case 3: ProcessBlink(displayData, 2); break; // 日
  185.         case 4: ProcessBlink(displayData, 4); break; // 时
  186.         case 5: ProcessBlink(displayData, 6); break; // 分
  187.         case 6: displayData[15] = (sys.blink_counter < 5) ? segCode[0] : segCode[11 + sys.weekday]; break;
  188.     }
  189. }

  190. void PrepareDisplayData2(unsigned char *displayData) {
  191.     memset(displayData, 0, 8);
  192.    
  193.     // 公历年份(GRID1-4)
  194.     displayData[0] = segCode[sys.year/1000];
  195.     displayData[1] = segCode[(sys.year%1000)/100];
  196.     displayData[2] = segCode[(sys.year%100)/10];
  197.     displayData[3] = segCode[sys.year%10];
  198.    
  199.     // 农历月份(GRID5-6)
  200.     displayData[4] = segCode[sys.month/10];
  201.     displayData[5] = segCode[sys.month%10];
  202.    
  203.     // 农历日期(GRID7-8)
  204.     displayData[6] = segCode[sys.day/10];
  205.     displayData[7] = segCode[sys.day%10];
  206.    
  207.     // 年份设置闪烁
  208.     if(sys.setting_mode == 1) {
  209.         for(int i=0; i<4; i++) {
  210.             displayData[i] = (sys.blink_counter < 5) ? segCode[0] : displayData[i];
  211.         }
  212.     }
  213. }

  214. void AdjustBrightness() {
  215.     if(KeyPressed(KEY_BRIGHT)) {
  216.         sys.brightness++;
  217.         if(sys.brightness > 7) sys.brightness = 1;
  218.     }
  219. }

  220. void ProcessTimeSetting() {
  221.     // 长按5秒进入/退出设置
  222.     if(KeyLongPressed(KEY_SET)) {
  223.         if(sys.setting_mode == 0) {
  224.             sys.setting_mode = 1; // 进入设置
  225.         } else {
  226.             sys.setting_mode = 0; // 退出设置
  227.             // 保存时间到DS3231...
  228.         }
  229.     }
  230.    
  231.     // 设置模式处理
  232.     if(sys.setting_mode > 0) {
  233.         // 短按切换设置项
  234.         if(KeyPressed(KEY_SET)) {
  235.             sys.setting_mode++;
  236.             if(sys.setting_mode > 6) sys.setting_mode = 1;
  237.         }
  238.         
  239.         // 增加键
  240.         if(KeyPressed(KEY_UP)) {
  241.             switch(sys.setting_mode) {
  242.                 case 1: sys.year++; if(sys.year > 2099) sys.year = 1901; break;
  243.                 case 2: sys.month++; if(sys.month > 12) sys.month = 1; break;
  244.                 case 3: sys.day++; if(sys.day > 31) sys.day = 1; break;
  245.                 case 4: sys.hour++; if(sys.hour > 23) sys.hour = 0; break;
  246.                 case 5: sys.minute++; if(sys.minute > 59) sys.minute = 0; break;
  247.                 case 6: sys.weekday++; if(sys.weekday > 6) sys.weekday = 0; break;
  248.             }
  249.         }
  250.         
  251.         // 减少键
  252.         if(KeyPressed(KEY_DOWN)) {
  253.             switch(sys.setting_mode) {
  254.                 case 1: sys.year--; if(sys.year < 1901) sys.year = 2099; break;
  255.                 case 2: sys.month--; if(sys.month < 1) sys.month = 12; break;
  256.                 case 3: sys.day--; if(sys.day < 1) sys.day = 31; break;
  257.                 case 4: sys.hour--; if(sys.hour > 23) sys.hour = 23; break;
  258.                 case 5: sys.minute--; if(sys.minute > 59) sys.minute = 59; break;
  259.                 case 6: sys.weekday--; if(sys.weekday > 6) sys.weekday = 6; break;
  260.             }
  261.         }
  262.         
  263.         // 日期有效性检查
  264.         if(sys.month == 2) {
  265.             int is_leap = (sys.year%4 == 0 && sys.year%100 != 0) || (sys.year%400 == 0);
  266.             if(sys.day > (is_leap ? 29 : 28)) sys.day = is_leap ? 29 : 28;
  267.         }
  268.         else if(sys.month == 4 || sys.month == 6 || sys.month == 9 || sys.month == 11) {
  269.             if(sys.day > 30) sys.day = 30;
  270.         }
  271.         
  272.         // 15秒无操作退出
  273.         sys.inactive_counter++;
  274.         if(sys.inactive_counter >= SETTING_TIMEOUT) {
  275.             sys.setting_mode = 0;
  276.         }
  277.     }
  278. }

  279. void UpdateDisplay() {
  280.     unsigned char displayData1[16];
  281.     unsigned char displayData2[8];
  282.    
  283.     PrepareDisplayData1(displayData1);
  284.     PrepareDisplayData2(displayData2);
  285.    
  286.     TM1640_Display(displayData1, 16, TM1640_1_DIN, TM1640_1_SCLK);
  287.     TM1640_Display(displayData2, 8, TM1640_2_DIN, TM1640_2_SCLK);
  288. }

  289. void SystemInit() {
  290.     // IO口模式设置
  291.     P1M0 = 0x0F;  // P1.0-P1.3推挽输出
  292.     P1M1 = 0x00;
  293.     P1M0 |= 0xF0; // P1.4-P1.7上拉输入
  294.     P3M0 = 0xC0;  // P3.6,P3.7推挽输出
  295.     P3M1 = 0x00;
  296.    
  297.     // 初始化时间数据
  298.     sys.year = 2025;
  299.     sys.month = 6;
  300.     sys.day = 27;
  301.     sys.hour = 14;
  302.     sys.minute = 30;
  303.     sys.second = 0;
  304.     sys.weekday = 4;
  305.     sys.temperature = 25.6;
  306.     sys.humidity = 65.2;
  307.     sys.brightness = 4;
  308.     sys.setting_mode = 0;
  309.     sys.blink_counter = 0;
  310.     sys.key_press_time = 0;
  311.     sys.inactive_counter = 0;
  312. }

  313. void main() {
  314.     SystemInit();
  315.    
  316.     while(1) {
  317.         // 处理按键
  318.         AdjustBrightness();
  319.         ProcessTimeSetting();
  320.         
  321.         // 更新显示
  322.         UpdateDisplay();
  323.         
  324.         // 系统延时
  325.         DelayMS(100);
  326.     }
  327. }
复制代码
回复 支持 反对

使用道具 举报

发表于 昨天 13:46 | 显示全部楼层
本身没有调试过。
回复 支持 反对

使用道具 举报

发表于 昨天 14:01 | 显示全部楼层
所谓AI,不就是东拼西凑而来的吗
回复 支持 反对

使用道具 举报

发表于 昨天 14:40 | 显示全部楼层
好歹也把报错信息发上来吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 昨天 14:53 | 显示全部楼层
wangbeng 发表于 2025-7-15 14:40
好歹也把报错信息发上来吧。

错误信息如下:

Build target '目标 1'
compiling 万年历.c...
万年历.C(54): error C141: syntax error near 'sbit'
万年历.C(55): error C141: syntax error near 'sbit'
万年历.C(56): error C141: syntax error near 'sbit'
万年历.C(57): error C141: syntax error near 'sbit'
万年历.C(58): error C141: syntax error near ','
万年历.C(58): error C141: syntax error near 'sbit'
万年历.C(74): error C141: syntax error near 'sbit'
万年历.C(75): error C202: 'key': undefined identifier
万年历.C(77): error C202: 'key': undefined identifier
万年历.C(78): error C202: 'key': undefined identifier
万年历.C(86): error C141: syntax error near 'sbit'
万年历.C(87): error C202: 'key': undefined identifier
万年历.C(89): error C202: 'key': undefined identifier
万年历.C(93): error C202: 'key': undefined identifier
万年历.C(102): error C141: syntax error near 'sbit'
万年历.C(105): error C202: 'sclk_pin': undefined identifier
万年历.C(107): error C202: 'din_pin': undefined identifier
万年历.C(109): error C202: 'sclk_pin': undefined identifier
万年历.C(115): error C141: syntax error near 'sbit'
万年历.C(119): error C202: 'din_pin': undefined identifier
万年历.C(120): error C202: 'sclk_pin': undefined identifier
万年历.C(122): error C202: 'din_pin': undefined identifier
万年历.C(125): error C202: 'din_pin': undefined identifier
万年历.C(127): error C202: 'din_pin': undefined identifier
万年历.C(128): error C202: 'sclk_pin': undefined identifier
万年历.C(130): error C202: 'sclk_pin': undefined identifier
万年历.C(132): error C202: 'din_pin': undefined identifier
万年历.C(135): error C141: syntax error near ','
万年历.C(135): error C141: syntax error near 'sbit'
万年历.C(137): error C202: 'din_pin': undefined identifier
万年历.C(138): error C202: 'sclk_pin': undefined identifier
万年历.C(140): error C202: 'din_pin': undefined identifier
万年历.C(143): error C202: 'din_pin': undefined identifier
万年历.C(144): error C202: 'din_pin': undefined identifier
万年历.C(147): error C141: syntax error near 'data'
目标未创建
回复 支持 反对

使用道具 举报

发表于 昨天 15:02 | 显示全部楼层
楼主不如用AiCube之STC8H8K64U辅助开发,程序自动生成:




教学视频免费观看

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册 微信登录

x
回复 支持 反对

使用道具 举报

发表于 昨天 16:14 来自手机浏览器 | 显示全部楼层
lmn2005 发表于 2025-7-15 14:01
所谓AI,不就是东拼西凑而来的吗

这个好像就是直接偷别人的代码。
回复 支持 反对

使用道具 举报

发表于 昨天 18:11 | 显示全部楼层
mmxx2015 发表于 2025-7-15 16:14
这个好像就是直接偷别人的代码。

个人感觉,至少百度搭载的AI就是一个搜索、比对、归纳、整理的过程,这东西叫做“智能搜索”或许更贴切些。
回复 支持 反对

使用道具 举报

发表于 昨天 20:52 | 显示全部楼层
本帖最后由 wangbeng 于 2025-7-15 21:00 编辑
piaoxu2013 发表于 2025-7-15 14:53
错误信息如下:

Build target '目标 1'

sbit 只是用来表示位变量的一种方式,相当于是给寄存器(位)取个别名,并不是如int ,char等这样的数据类型,所以并不能作为函数参数类型使用。

如 :bit KeyPressed(sbit key); 这一行报错,应该就是使用了sbit 作为key参数的类型,才导致的。后面类似。


(正好电脑上没装keil,没法验证,只是理论想法,请自行验证)
回复 支持 反对

使用道具 举报

发表于 昨天 21:08 | 显示全部楼层

AI只不过是个搜索引型,功力还得自己发。
回复 支持 反对

使用道具 举报

发表于 4 小时前 | 显示全部楼层
没入门是不配使用AI的。就像两个瞎子出门,互相带偏。入门之后,某些方面欠缺或想省点时间,AI是有帮助的。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-16 04:44 , Processed in 0.109200 second(s), 7 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

快速回复 返回顶部 返回列表