找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1606|回复: 4
收起左侧

单片机12864数据端口如何更改为P1 求助

[复制链接]
ID:242298 发表于 2020-12-18 18:04 | 显示全部楼层 |阅读模式
怎么更改数据端口P0为P1输出。其他程序还要改什么呢,谢谢各位大神
  1. //---程序说明---//

  2. /*

  3.         名字:main.c

  4.         创建日:2006-11-26

  5.         工程:智能助理电子钟(AI-timer)

  6. */

  7. //---修改日志---//

  8. /*

  9. */


  10. //---硬件说明---//

  11. /*

  12. P0.0~0.7        NC

  13. P1.0                右上角LED-G                低电平有效(L)

  14. P1.1                右下角LED-G                L

  15. P1.2                左下角LED-G                L

  16. P1.3                左上角LED-G                L

  17. P1.4                4个LED-R                L

  18. P1.5~1.7        ISP下载用                ~

  19. P2.1                LCM -5 SID                串行数据输入,~

  20. P2.2                LCD -6 CLK                串行时钟,~

  21. P2.3                左上角KEY                -

  22. P2.4                左下角KEY                -

  23. P2.5                右上角KEY                -

  24. P2.6                右下角KEY                -

  25. P2.7                背后LED-B                L

  26. P3.0                温度单总线                ~

  27. P3.1                BEEP                        L

  28. P3.2                KEY中断                        -

  29. P3.3                DS1302 -5 RST_        低电平复位(L)

  30. P3.4                DS1302 -6 IO        ~

  31. P3.5                DS1302 -7 SCLK        ~

  32. P3.6                24C02 -6 SCL        ~

  33. P3.7                24C02 -5 SDA        ~

  34. */

  35. /****************************************************************************/

  36. //头文件

  37. #include <AT89X52.h>

  38. #include <string.h>

  39. /*****************************************************************************/

  40. //灯与蜂鸣器定义

  41. sbit        led_b = P2^7;

  42. sbit        led_r = P1^4;

  43. sbit        led_g1 = P1^3;

  44. sbit        led_g2 = P1^2;

  45. sbit        led_g3 = P1^0;

  46. sbit        led_g4 = P1^1;

  47. sbit        beep   = P3^1;

  48. /*****************************************************************************/

  49. //温度传感器定义

  50. sbit DQ = P3 ^ 0;//ds18B20

  51. /*****************************************************************************/

  52. //键盘引脚定义

  53. sbit KEY_1 = P2^3;         //左上

  54. sbit KEY_2 = P2^4;         //左下

  55. sbit KEY_3 = P2^6;         //右上

  56. sbit KEY_4 = P2^5;         //右下

  57. sbit KEY_I = P3^2;         //常0

  58. /****************************************************************************/

  59. //引脚定义

  60. sbit   SID   =  P2^1;        //数据

  61. sbit   SCLK  =  P2^2;        //时钟

  62. /*****************************************************************************/

  63. //定义DS1302时钟接口

  64. sbit clock_clk = P3 ^ 5;//ds1302_clk(时钟线)

  65. sbit clock_dat = P3 ^ 4;//ds1302_dat(数据线)

  66. sbit clock_Rst = P3 ^ 3;//ds1302_Rst(复位线)

  67. /*****************************************************************************/

  68. //定义累加器A中的各位

  69. sbit a0   = ACC ^ 0;

  70. sbit a1   = ACC ^ 1;

  71. sbit a2   = ACC ^ 2;

  72. sbit a3   = ACC ^ 3;

  73. sbit a4   = ACC ^ 4;

  74. sbit a5   = ACC ^ 5;

  75. sbit a6   = ACC ^ 6;

  76. sbit a7   = ACC ^ 7;

  77. /****************************************************************************/

  78. //定义全局变量

  79. unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)

  80. bit w = 0; //调时标志位

  81. static unsigned char menu = 0;//定义静态小时更新用数据变量

  82. static unsigned char keys = 0;//定义静态小时更新用数据变量

  83. static unsigned char timecount = 0;//定义静态软件计数器变量

  84. /****************************************************************************/

  85. void DelayM(unsigned int a){//延时函数 1MS/次        

  86.                 unsigned char i;

  87.                 while( --a != 0){               

  88.                         for(i = 0; i < 125; i++);  //一个 ; 表示空语句,CPU空转。

  89.                 }                                      //i 从0加到125,CPU大概就耗时1毫秒

  90. }

  91. /****************************************************************************/

  92. //函数声明

  93. void lcm_w_word(unsigned char *str) ;  //写字符  例:lcm_w_word("您好!");

  94. void lcm_w_test(bit start,unsigned char ddata);  //(0,指令) (1,数据)

  95. void lcm_w_byte(unsigned char bbyte);  //写一个字节给lcm

  96. void delaynms(unsigned int di);  //延时

  97. void lcm_init(void); //lcm初始化

  98. void lcm_clr(void);  //清屏

  99. void days (viod) {          //公历节日数据库

  100.                 lcm_w_test(0,0x80);

  101.                 lcm_w_word("[Dis]      [Set]");

  102.                 lcm_w_test(0,0x98);

  103. //                                                                                                ----|----------------|

  104.                 if ( mo == 0x01 && dd == 0x01 ){ lcm_w_word("Happy New Year!!"); }//1月

  105.                 if ( mo == 0x01 && dd == 0x28 ){ lcm_w_word("  世界麻风日    "); }

  106.                 if ( mo == 0x02 && dd == 0x02 ){ lcm_w_word("  世界湿地日    "); }//2月

  107.                 if ( mo == 0x02 && dd == 0x13 ){ lcm_w_word("  明天情人节了  "); }               

  108.                 if ( mo == 0x02 && dd == 0x14 ){ lcm_w_word("  今天是情人节  "); }

  109.                 if ( mo == 0x03 && dd == 0x01 ){ lcm_w_word("  国际海豹日    "); }//3月               

  110.                 if ( mo == 0x03 && dd == 0x03 ){ lcm_w_word("  全国爱耳日    "); }               

  111.                 if ( mo == 0x03 && dd == 0x08 ){ lcm_w_word("   3.8妇女节    "); }               

  112.                 if ( mo == 0x03 && dd == 0x12 ){ lcm_w_word("    植树节      "); }               

  113.                 if ( mo == 0x03 && dd == 0x14 ){ lcm_w_word("  国际警察日    "); }               

  114.                 if ( mo == 0x03 && dd == 0x15 ){ lcm_w_word("  消费者权益日  "); }               

  115.                 if ( mo == 0x03 && dd == 0x17 ){ lcm_w_word("  国际航海日    "); }               

  116.                 if ( mo == 0x03 && dd == 0x21 ){ lcm_w_word("  世界森林日    "); }               

  117.                 if ( mo == 0x03 && dd == 0x22 ){ lcm_w_word("    世界水日    "); }               

  118.                 if ( mo == 0x03 && dd == 0x23 ){ lcm_w_word("  世界气象日    "); }               

  119.                 if ( mo == 0x03 && dd == 0x24 ){ lcm_w_word("日"); }

  120.                 if ( mo == 0x04 && dd == 0x01 ){ lcm_w_word("愚人节  小心上当"); }//4               

  121.                 if ( mo == 0x04 && dd == 0x07 ){ lcm_w_word("  世界卫生日    "); }               

  122.                 if ( mo == 0x04 && dd == 0x08 ){ lcm_w_word("    复活节      "); }               

  123.                 if ( mo == 0x04 && dd == 0x13 ){ lcm_w_word("  黑色星期五    "); }

  124.                 if ( mo == 0x05 && dd == 0x01 ){ lcm_w_word("  劳动节  放假  "); }//5               

  125.                 if ( mo == 0x05 && dd == 0x04 ){ lcm_w_word("    青年节      "); }               

  126.                 if ( mo == 0x05 && dd == 0x08 ){ lcm_w_word("  世界红十字日  "); }               

  127.                 if ( mo == 0x05 && dd == 0x12 ){ lcm_w_word("  国际护士节    "); }               

  128.                 if ( mo == 0x05 && dd == 0x05 ){ lcm_w_word("近日注意母亲节  "); }               

  129.                 if ( mo == 0x05 && dd == 0x15 ){ lcm_w_word("  国际家庭日    "); }

  130.                 if ( mo == 0x05 && dd == 0x31 ){ lcm_w_word("  世界无烟日    "); }               

  131.                 if ( mo == 0x06 && dd == 0x01 ){ lcm_w_word("  国际儿童节    "); }//6

  132.                 if ( mo == 0x06 && dd == 0x05 ){ lcm_w_word("  世界环境日    "); }               

  133.                 if ( mo == 0x06 && dd == 0x26 ){ lcm_w_word("  日    "); }               

  134.                 if ( mo == 0x06 && dd == 0x06 ){ lcm_w_word("  全国爱眼日    "); }               

  135.                 if ( mo == 0x06 && dd == 0x13 ){ lcm_w_word("近日注意父亲节  "); }

  136.                 if ( mo == 0x06 && dd == 0x15 ){ lcm_w_word("近日注意父亲节  "); }

  137.                 if ( mo == 0x07 && dd == 0x01 ){ lcm_w_word("记念日  "); }//7

  138.                 if ( mo == 0x07 && dd == 0x07 ){ lcm_w_word("抗日战争记念日  "); }

  139.                 if ( mo == 0x07 && dd == 0x11 ){ lcm_w_word("  世界人口日    "); }

  140.                 if ( mo == 0x08 && dd == 0x01 ){ lcm_w_word("  八一建军节    "); }//8

  141.                 if ( mo == 0x08 && dd == 0x08 ){ lcm_w_word("  中国男子节    "); }

  142.                 if ( mo == 0x08 && dd == 0x15 ){ lcm_w_word("抗战胜利记念日  "); }

  143.                 if ( mo == 0x09 && dd == 0x10 ){ lcm_w_word("  中国教师节    "); }//9

  144.                 if ( mo == 0x09 && dd == 0x18 ){ lcm_w_word("九·一八事变记念"); }

  145.                 if ( mo == 0x09 && dd == 0x20 ){ lcm_w_word("  国际爱牙日    "); }

  146.                 if ( mo == 0x09 && dd == 0x27 ){ lcm_w_word("  世界旅游日    "); }

  147.                 if ( mo == 0x10 && dd == 0x01 ){ lcm_w_word("  中国国庆节    "); }//10

  148.                 if ( mo == 0x10 && dd == 0x04 ){ lcm_w_word("  世界动物日    "); }

  149.                 if ( mo == 0x10 && dd == 0x24 ){ lcm_w_word("    联合国日    "); }

  150.                 if ( mo == 0x10 && dd == 0x12 ){ lcm_w_word("明天国际教师节  "); }

  151.                 if ( mo == 0x10 && dd == 0x13 ){ lcm_w_word("  国际教师节    "); }

  152.                 if ( mo == 0x11 && dd == 0x10 ){ lcm_w_word("  世界青年节    "); }//11

  153.                 if ( mo == 0x11 && dd == 0x17 ){ lcm_w_word("  世界学生节    "); }

  154.                 if ( mo == 0x12 && dd == 0x01 ){ lcm_w_word("  世界艾滋病日  "); }//12

  155.                 if ( mo == 0x12 && dd == 0x23 ){ lcm_w_word("  明晚平安夜    "); }

  156.                 if ( mo == 0x12 && dd == 0x24 ){ lcm_w_word("  今晚平安夜    "); }

  157.                 if ( mo == 0x12 && dd == 0x25 ){ lcm_w_word("    圣诞快乐    "); }

  158.                 if ( mo == 0x12 && dd == 0x31 ){ lcm_w_word("    明日新年    "); }

  159.                 else{

  160.                         if ( hh >= 0x04 && hh <  0x06 ){ lcm_w_word("★★__▲▲__凌晨"); }

  161.                         if ( hh >= 0x06 && hh <  0x08 ){ lcm_w_word("☆○__▲△__早晨"); }

  162.                         if ( hh >= 0x08 && hh <  0x12 ){ lcm_w_word("__●__▲▲__上午"); }

  163.                         if ( hh == 0x12)               { lcm_w_word("____▲●▲__中午"); }

  164.                         if ( hh >= 0x13 && hh <  0x18 ){ lcm_w_word("__▲▲__●__下午"); }

  165.                         if ( hh >= 0x18 && hh <  0x22 ){ lcm_w_word("△▲__●☆__晚上"); }

  166.                         if ( hh >= 0x22 && hh <= 0x23 ){ lcm_w_word("△▲__★☆__夜里"); }

  167.                         if ( hh >= 0x00 && hh <  0x04 ){ lcm_w_word("__★▲▲★__深夜"); }

  168.                         }



  169. }

  170. /****************************************************************************/

  171. //初始化LCM

  172. void lcm_init(void)         {

  173.         delaynms(100); //启动等待,等LCM讲入工作状态

  174.           lcm_w_test(0,0x30);  //8 位介面,基本指令集

  175.           lcm_w_test(0,0x0c);  //显示打开,光标关,反白关

  176.           lcm_w_test(0,0x01);  //清屏,将DDRAM的地址计数器归零

  177.         delaynms(100); //启动等待,等LCM讲入工作状态

  178. }

  179. /******************************************************************************/

  180. //写指令或数据  (0,指令) (1,数据)

  181. void lcm_w_test(bit start, unsigned char ddata) {

  182.         unsigned char start_data,Hdata,Ldata;

  183.           if(start==0)

  184.                 start_data=0xf8;         //0:写指令

  185.     else   

  186.             start_data=0xfa;  //1:写数据

  187.           Hdata=ddata&0xf0;                  //取高四位

  188.           Ldata=(ddata<<4)&0xf0;  //取低四位

  189.           lcm_w_byte(start_data);          //发送起始信号

  190.           delaynms(5); //延时是必须的

  191.           lcm_w_byte(Hdata);              //发送高四位

  192.           delaynms(5);  //延时是必须的

  193.           lcm_w_byte(Ldata);                  //发送低四位

  194.           delaynms(5);  //延时是必须的

  195. }

  196. /******************************************************************************/

  197. //发送一个字节(底层函数)

  198. void lcm_w_byte(unsigned char bbyte) {

  199.         unsigned char i;

  200.          for(i=0;i<8;i++){

  201.                    SID=bbyte&0x80; //取出最高位

  202.                  SCLK=1;

  203.                    SCLK=0;

  204.                    bbyte<<=1; //左移

  205.            }  

  206. }

  207. /******************************************************************************/

  208. //延时(LCM占用)

  209. void delaynms(unsigned int di) {

  210.         unsigned int da,db;

  211.          for(da=0;da<di;da++);

  212.                    for(db=0;db<10;db++);

  213. }

  214. /*****************************************************************************/

  215. //清屏函数

  216. void lcm_clr(void){

  217.         lcm_w_test(0,0x01);

  218.         delaynms(40); //启动等待,等LCM讲入工作状态

  219. }

  220. /*****************************************************************************/

  221. //向LCM发送一个字符串,长度64字符之内。

  222. //应用:lcm_w_word("您好!");

  223. void lcm_w_word(unsigned char *str){

  224.                 while(*str != '\0'){

  225.                         lcm_w_test(1,*str++);

  226.         }

  227.                 *str = 0;

  228. }

  229. /******************************************************************************/

  230. void Delay(int num)//延时函数

  231. {

  232.         while(num--) ;

  233. }        

  234. /******************************************************************************/

  235. void Init_DS18B20(void)//初始化ds1820

  236. {

  237.         unsigned char x=0;

  238.         DQ = 1;    //DQ复位

  239.         Delay(8);  //稍做延时

  240.         DQ = 0;    //单片机将DQ拉低

  241.         Delay(80); //精确延时 大于 480us

  242.         DQ = 1;    //拉高总线

  243.         Delay(14);

  244.         x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

  245.         Delay(20);

  246. }

  247. /******************************************************************************/

  248. unsigned char ReadOneChar(void)//读一个字节

  249. {

  250.         unsigned char i=0;

  251.         unsigned char dat = 0;

  252.         for (i=8;i>0;i--)

  253.         {

  254.                 DQ = 0; // 给脉冲信号

  255.                 dat>>=1;

  256.                 DQ = 1; // 给脉冲信号

  257.                 if(DQ)

  258.                 dat|=0x80;

  259.                 Delay(4);

  260.         }

  261.         return(dat);

  262. }

  263. /******************************************************************************/

  264. void WriteOneChar(unsigned char dat)//写一个字节

  265. {

  266.         unsigned char i=0;

  267.         for (i=8; i>0; i--)

  268.         {

  269.                 DQ = 0;

  270.                 DQ = dat&0x01;

  271.                 Delay(5);

  272.                 DQ = 1;

  273.                 dat>>=1;

  274.         }

  275. }

  276. /******************************************************************************/

  277. unsigned int ReadTemperature(void)//读取温度

  278. {

  279.         unsigned char a=0;

  280.         unsigned char b=0;

  281.         unsigned int t=0;

  282.         float tt=0;

  283.         Init_DS18B20();

  284.         WriteOneChar(0xCC); // 跳过读序号列号的操作

  285.         WriteOneChar(0x44); // 启动温度转换

  286.         Init_DS18B20();

  287.         WriteOneChar(0xCC); //跳过读序号列号的操作

  288.         WriteOneChar(0xBE); //读取温度寄存器

  289.         a=ReadOneChar();  //读低8位

  290.         b=ReadOneChar(); //读高8位

  291.         t=b;

  292.         t<<=8;

  293.         t=t|a;

  294.         tt=t*0.0625;

  295.         t= tt*10+0.5; //放大10倍输出并四舍五入

  296.         return(t);

  297. }

  298. /*****************************************************************************/

  299. //声明

  300. void lcm_w_ss(void);void lcm_w_mm(void);

  301. void lcm_w_hh(void);void lcm_w_dd(void);

  302. void lcm_w_mo(void);void lcm_w_yy(void);void lcm_w_xq(void);

  303. unsigned char clock_in(void);

  304. void clock_out(unsigned char dd);

  305. void Init_1302(void);

  306. unsigned char read_clock(unsigned char ord);

  307. void read_clockS(void);

  308. void Set_time(unsigned char sel);

  309. void write_clock(unsigned char ord, unsigned char dd);

  310. void updata (void);

  311. /*****************************************************************************/

  312. //常用时钟数据读取

  313. void read_clockS(void){

  314.         ss = read_clock(0x81);//读取秒数据

  315.         mm = read_clock(0x83);//读取分钟数据

  316.         hh = read_clock(0x85);//小时

  317.         dd = read_clock(0x87);//日

  318.         mo = read_clock(0x89);//月

  319.         xq = read_clock(0x8b);//星期

  320.         yy = read_clock(0x8d);//年

  321. }

  322. /*****************************************************************************/

  323. //调时用加1程序

  324. void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302

  325.   signed char address,item;

  326.   signed char max,mini;

  327.   lcm_w_test(0,0x9a);

  328.   lcm_w_word("调整");

  329.   //if(sel==6)  {lcm_w_word("秒钟");address=0x80; max=0;mini=0;}     //秒7

  330.   if(sel==5)  {lcm_w_word("分钟");address=0x82; max=59;mini=0;}    //分钟6

  331.   if(sel==4)  {lcm_w_word("小时");address=0x84; max=23;mini=0;}    //小时5

  332.   if(sel==3)  {lcm_w_word("星期");address=0x8a; max=7;mini=1;}    //星期4  

  333.   if(sel==2)  {lcm_w_word("日期");address=0x86; max=31;mini=1;}    //日3

  334.   if(sel==1)  {lcm_w_word("月份");address=0x88; max=12;mini=1;}    //月2

  335.   if(sel==0)  {lcm_w_word("年份");address=0x8c; max=99; mini=0;}    //年1

  336.   //读取1302某地址上的数值转换成10进制赋给item

  337.   item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;

  338.   if(KEY_2 == 0){

  339.           item++;//数加 1  

  340.   }

  341.   if(KEY_4 == 0){

  342.           item--;//数减 1

  343.   }

  344.   if(item>max) item=mini;//查看数值有效范围   

  345.   if(item<mini) item=max;           

  346.   write_clock(0x8e,0x00);//允许写操作

  347.   write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302

  348.   write_clock(0x8e,0x80);//写保护,禁止写操作

  349.   updata ();        //刷新数据

  350.   lcm_w_mm();//刷新 分

  351. }

  352. /*****************************************************************************/

  353. //设置1302的初始时间

  354. void Init_1302(void){//(2007年1月1日00时00分00秒星期一)

  355.         write_clock(0x8e,0x00);//允许写操作

  356.         write_clock(0x8c,0x07);//年

  357.         write_clock(0x8a,0x01);//星期

  358.         write_clock(0x88,0x01);//月

  359.         write_clock(0x86,0x01);//日

  360.         write_clock(0x84,0x00);//小时

  361.         write_clock(0x82,0x00);//分钟

  362.         write_clock(0x80,0x00);//秒

  363.         write_clock(0x90,0xa5);//充电        

  364.         write_clock(0x8e,0x80);//禁止写操作

  365. }

  366. /*****************************************************************************/

  367. //DS1302写数据(底层协议)

  368. void write_clock(unsigned char ord, unsigned char dd){

  369.         clock_clk=0;

  370.         clock_Rst=0;

  371.         clock_Rst=1;

  372.         clock_out(ord);

  373.         clock_out(dd);

  374.         clock_Rst=0;

  375.         clock_clk=1;

  376. }

  377. /*****************************************************************************/

  378. //1302驱动程序(底层协议)

  379. void clock_out(unsigned char dd){

  380.         ACC=dd;

  381.         clock_dat=a0; clock_clk=1; clock_clk=0;

  382.         clock_dat=a1; clock_clk=1; clock_clk=0;

  383.         clock_dat=a2; clock_clk=1; clock_clk=0;

  384.         clock_dat=a3; clock_clk=1; clock_clk=0;

  385.         clock_dat=a4; clock_clk=1; clock_clk=0;

  386.         clock_dat=a5; clock_clk=1; clock_clk=0;

  387.         clock_dat=a6; clock_clk=1; clock_clk=0;

  388.         clock_dat=a7; clock_clk=1; clock_clk=0;

  389. }

  390. /*****************************************************************************/

  391. //DS1302写入字节(底层协议)

  392. unsigned char clock_in(void){

  393.         clock_dat=1;

  394.         a0=clock_dat;

  395.         clock_clk=1; clock_clk=0; a1=clock_dat;

  396.         clock_clk=1; clock_clk=0; a2=clock_dat;

  397.         clock_clk=1; clock_clk=0; a3=clock_dat;

  398.         clock_clk=1; clock_clk=0; a4=clock_dat;

  399.         clock_clk=1; clock_clk=0; a5=clock_dat;

  400.         clock_clk=1; clock_clk=0; a6=clock_dat;

  401.         clock_clk=1; clock_clk=0; a7=clock_dat;

  402.         return(ACC);

  403. }

  404. /*****************************************************************************/

  405. //DS1302读数据(底层协议)

  406. unsigned char read_clock(unsigned char ord){

  407.         unsigned char dd=0;

  408.         clock_clk=0;

  409.         clock_Rst=0;

  410.         clock_Rst=1;

  411.         clock_out(ord);

  412.         dd=clock_in();

  413.         clock_Rst=0;

  414.         clock_clk=1;

  415.         return(dd);

  416. }

  417. /*****************************************************************************/

  418. //向LCM中填写 年 数据

  419. void lcm_w_yy(void){

  420.         //if(read_clock(0x8d) != yy){

  421.                 yy = read_clock(0x8d);

  422.                 lcm_w_test(0,0x83);

  423.                 lcm_w_word("20");

  424.                 lcm_w_test(0,0x84);

  425.                 lcm_w_test(1,(yy/16)+0x30);        

  426.                 lcm_w_test(1,yy%16+0x30);

  427. }        //}

  428. /*****************************************************************************/

  429. //向LCM中填写 月 数据

  430. void lcm_w_mo(void){

  431.         //if(read_clock(0x89) != mo){

  432.                 mo = read_clock(0x89);

  433.                 lcm_w_test(0,0x90);

  434.                         if(mo/16 != 0){lcm_w_test(1,(mo/16)+0x30);}        //十位消隐

  435.                         else{lcm_w_test(1,0x20);}//同上                        

  436.                 lcm_w_test(1,mo%16+0x30);

  437.                 lcm_w_test(0,0x91);

  438.                 lcm_w_word("月");

  439. }        //}

  440. /*****************************************************************************/

  441. //星期处理并送入LCM的指定区域

  442. void lcm_w_xq(void){

  443.         unsigned char sel;

  444.         //if(read_clock(0x8b) != xq){

  445.         xq = read_clock(0x8b);

  446.         sel = (read_clock(0x8b))%16; //字节低4位的BCD码放入sel

  447.         lcm_w_test(0,0x97);//写入指定区域(97H 第二行第8个字)

  448.         if(sel==7)  {lcm_w_word("日");}    //

  449.           if(sel==6)  {lcm_w_word("六");}    //

  450.           if(sel==5)  {lcm_w_word("五");}    //

  451.           if(sel==4)  {lcm_w_word("四");}    //

  452.           if(sel==3)  {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //此指令等于lcm_w_word("三"); 因为“三”的内码失效。

  453.           if(sel==2)  {lcm_w_word("二");}    //

  454.           if(sel==1)  {lcm_w_word("一");}    //星期一

  455.         lcm_w_test(0,0x95);

  456.         lcm_w_word("星期");

  457.         //}

  458. }

  459. /*****************************************************************************/

  460. //向LCM中填写 日 数据

  461. void lcm_w_dd(void){

  462. //        if(read_clock(0x87) != dd){

  463.                 dd = read_clock(0x87);

  464.                 lcm_w_test(0,0x92);

  465.                         if(dd/16 != 0){lcm_w_test(1,(dd/16)+0x30);}        //十位消隐

  466.                         else{lcm_w_test(1,0x20);}//同上        

  467.                 lcm_w_test(1,dd%16+0x30);

  468.                 lcm_w_test(0,0x93);

  469.                 lcm_w_word("日  ");

  470. }        //}

  471. /*****************************************************************************/

  472. //向LCM中填写 小时 数据

  473. void lcm_w_hh(void){

  474.         if(read_clock(0x85) != hh){

  475.                 hh = read_clock(0x85);

  476.                         if (hh > 0x07 && hh < 0x22 && w == 0){

  477.                                 beep = 0; led_r = 0;

  478.                                 DelayM(100);

  479.                                 beep = 1; led_r = 1;

  480.                         }

  481.                 }

  482.                 lcm_w_test(0,0x88);

  483.                 lcm_w_test(1,(hh/16)+0x30);

  484.                 lcm_w_test(1,hh%16+0x30);

  485. }        //}

  486. /*****************************************************************************/

  487. //向LCM中填写 分钟 数据

  488. void lcm_w_mm(void){

  489.         if(read_clock(0x83) != mm){               

  490.                 mm = read_clock(0x83);

  491.                 if( w == 0){                                

  492.                         days();           //节日显示

  493.                         updata ();        //刷新数据

  494.                 }                                

  495.         }

  496.         lcm_w_test(0,0x89);        

  497.         lcm_w_test(1,0x3a);          //":"

  498.         lcm_w_test(1,(mm/16)+0x30);

  499.         lcm_w_test(1,mm%16+0x30);

  500.         lcm_w_test(1,0x2e);         //"."        

  501. }

  502. /*****************************************************************************/

  503. //刷新数据

  504. void updata (void){

  505.                 lcm_w_hh();//刷新 小时

  506.                 lcm_w_dd();//刷新 日

  507.                 lcm_w_xq();//更新星期值        

  508.                 lcm_w_mo();//刷新 月

  509.                 lcm_w_yy();//刷新 年

  510. }

  511. /*****************************************************************************/

  512. //向LCM中填写 秒 数据

  513. void lcm_w_ss(void){

  514.         unsigned int i=0;

  515.         unsigned char a=0,b=0,c=0;

  516.         if(read_clock(0x81) != ss){        //判断是否需要更新

  517.                 ss = read_clock(0x81);        //更新数据

  518.                 lcm_w_test(0,0x8b);                //秒值在LCM上的写入位置

  519.                 lcm_w_test(1,(ss/16)+0x30);        //写十位               

  520.                 lcm_w_test(1,ss%16+0x30);        //写个位

  521.                 led_b = ~led_b;                                //背光闪烁

  522.                 lcm_w_mm();//刷新 分               

  523.         lcm_w_test(0,0x8d);                //温度在LCM上的写入位置               

  524.         i=ReadTemperature();//读温度并送显

  525.         a=i/100;

  526.         lcm_w_test(1,a+0x30);        //显示温度十位

  527.         b=i/10-a*10;

  528.         lcm_w_test(1,b+0x30);        //个位

  529.         lcm_w_test(1,0x2e);         //"."

  530.         c=i-a*100-b*10;

  531.         lcm_w_test(1,c+0x30); //小位1位               

  532.         lcm_w_word("℃");        //度C

  533. }        }

  534. /*****************************************************************************/

  535. //---主程序---//

  536. main() {

  537.         unsigned char e=0;

  538.         KEY_I = 0;KEY_1 = 1;KEY_2 = 1;KEY_3 = 1;KEY_4 = 1;//初始键盘

  539.         yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新

  540.                 beep = 0;

  541.                 DelayM(900);

  542.                 beep = 1;

  543.         lcm_init();//初始化液晶显示器

  544.         lcm_clr();//清屏

  545.         lcm_w_word("  12864LcdClock                  Hello !!       from DoYoung.net");//显示欢迎字

  546.         //----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//标尺

  547.         DelayM(3000); //显示等留3秒

  548.         //lcm_w_test(0,0x80);

  549.         //lcm_w_word("[Dis]      [Set]");

  550. while(1){

  551.                 if (w == 0){   //正常走时

  552.                 lcm_w_ss();//刷新 秒

  553.                 }

  554.                 else {                //启动调时


  555.                 }

  556.                 //------------------------------------------------------------------

  557.                 if (KEY_3 == 0) // 设置时间

  558.               {

  559.                        DelayM(20);           //去抖

  560.                         led_g3 = 0;led_r = 1;

  561.                         if(KEY_3 == 0 && w == 1)  //当是调时状态 本键用于调整下一项

  562.                         {

  563.                                 e++;

  564.                                 if (e >= 6 ){e = 0;}

  565.                                 Set_time(e);//调整                                

  566.                         }

  567.                         if(KEY_3 == 0 && w == 0)  //当是正常状态时就进入调时状态

  568.                         {

  569.                                 led_b = 1;//

  570.                                 lcm_clr();//清屏

  571.                                 //yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新

  572.                                 w=1;          //进入调时                                

  573.                                 lcm_w_test(0,0x9e);

  574.                                 lcm_w_word(" [-]");

  575.                                 lcm_w_test(0,0x80);

  576.                                 lcm_w_word("[Esc]");

  577.                                 lcm_w_test(0,0x85);

  578.                                 lcm_w_word("[Next]");

  579.                                 lcm_w_test(0,0x98);

  580.                                 lcm_w_word("[+]");

  581.                                 Set_time(e);//调整

  582.                         }

  583.                        while(KEY_3 == 0);//等待键松开

  584.                         led_g3 = 1; led_r = 0;//红灯亮,表示调时  

  585.               }

  586.                 //------------------------------------------------------------------

  587.                 if (KEY_1 == 0) // 当在调时状态时就退出调时

  588.               {

  589.                        DelayM(20);led_g1 = 0;led_r = 1;

  590.                        if(KEY_1 == 0 && w == 1){                                

  591.                                 w = 0;          //退出调时

  592.                                 e = 0;                //“下一项”计数器清0                                                               

  593.                         }

  594.                         if(KEY_1 == 0 && w == 0){                                

  595.                                 lcm_clr();//清屏

  596.                                 lcm_w_test(0,0x80);

  597.                                 lcm_w_word("  12864LcdClock V1.01 2006-11-26 Hello !!       from DoYoung.net");

  598.                                 //----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//标尺                                

  599.                                 while(KEY_1 == 0);//等待键松开  

  600.                         }

  601.                                 lcm_clr();//清屏

  602.                                 //lcm_w_word("[Dis]      [Set]");

  603.                                 //yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新                                

  604.                                 days();           //节日显示

  605.                                 updata ();        //刷新数据

  606.                                 lcm_w_mm();//刷新 分


  607.                        while(KEY_1 == 0);//等待键松开  

  608.                         led_g1 = 1;

  609.               }

  610.                 //------------------------------------------------------------------

  611.                 if (KEY_2 == 0 && w == 1){ // 加减调整{

  612.                        DelayM(20);led_g2 = 0;led_r = 1;

  613.                        if(KEY_2 == 0 && w == 1){                                

  614.                                 Set_time(e);//调整

  615.                         }

  616.                        while(KEY_2 == 0);//等待键松开

  617.                         led_g2 = 1; led_r = 0;   

  618.               }

  619.                 //------------------------------------------------------------------

  620.                 if (KEY_4 == 0 && w == 1){ // 加减调整              

  621.                        DelayM(20);        led_g4 = 0;led_r = 1;

  622.                        if(KEY_4 == 0 && w == 1){                                

  623.                                 Set_time(e);//调整

  624.                         }

  625.                        while(KEY_4 == 0);//等待键松开

  626.                         led_g4 = 1; led_r = 0;   

  627.               }

  628.            //------------------------------------------------------------------

  629.                  if(KEY_1 == 1 && KEY_2 == 0 && KEY_3 == 1 && KEY_4 == 0){        //时钟初始化{

  630.                         led_r = 0;

  631.                         DelayM(3000);

  632.                         led_r = 1;

  633.                         if(KEY_1 == 0 && KEY_2 == 0&& KEY_3 == 1&& KEY_4 == 0){

  634.                                 Init_1302();

  635.                                    lcm_w_test(0,0x80);

  636.                                 lcm_clr();//清屏

  637.                                 lcm_w_word("初始化成功!    2007-1-1 00:00.0");

  638.                                 //----------|-------1-------|-------3-------|        

  639.                                 while(1);

  640.                         }

  641.                 }                        

  642. }        }

  643. /*****************************************************************************/

  644. /*

  645. //编程日志

  646. 2007-02-10 修改为正式发布版。

  647. 2007-01-26 用每分钟刷新数据,防止显示乱码。

  648. 2006-11-30

  649. 2006-11-29 时钟主显示部分完成。

  650. 2006-11-28 时钟驱动程序植入完成。

  651. 2006-11-27 LCM驱动程序植入完成。

  652. 2006-11-26 硬件制作完成。

  653. /*****************************************************************************/
复制代码


回复

使用道具 举报

ID:517951 发表于 2020-12-18 20:42 | 显示全部楼层
在上面code中找到与显示屏连接的语句,是P2 的两个,可以改为P0 到P3 的任意一个,只要硬件接线没有做其他用途即可
//引脚定义

sbit   SID   =  P2^1;        //数据

sbit   SCLK  =  P2^2;        //时钟
回复

使用道具 举报

ID:242298 发表于 2020-12-19 01:04 | 显示全部楼层
rayin 发表于 2020-12-18 20:42
在上面code中找到与显示屏连接的语句,是P2 的两个,可以改为P0 到P3 的任意一个,只要硬件接线没有做其他 ...

我是需要把上面代码的p0-p7口改成p1-p7,谢谢,怎么改啊
回复

使用道具 举报

ID:824490 发表于 2020-12-19 11:30 | 显示全部楼层
满屏的if ......还大都是并列关系
一般来说超过3个并列的if....就考虑用SWICTH....CASE了,
回复

使用道具 举报

ID:160500 发表于 2020-12-19 12:31 | 显示全部楼层
凡是涉及到P0的都改为P1,P1的都改为你现在要使用的就ok
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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