[51单片机] 指针转换不合法 怎么更改程序

[复制链接]
1148|5
 楼主| 1154775677 发表于 2018-12-16 14:51 | 显示全部楼层 |阅读模式
  1. #include <reg52.h>
  2. #include<intrins.h>

  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;

  5. sbit RS = P3^5;
  6. sbit RW = P3^6;
  7. sbit EN = P3^4;

  8. #define LCD1602_A P0

  9. void delay_ms(uint n)
  10. {
  11. uint i,y;
  12. for(i=n;i>0;i--)
  13.         {
  14.   for(y=114;y>0;y--);
  15.         }               
  16. }


  17. // º¯ÊýÃû£ºÅÐæº¯Êý
  18. // º¯Êý¹¦ÄÜ£ºÅжÏÒº¾§ÊÇ·ñ·±Ã¦
  19. void Read_busy()
  20. {
  21.    uchar busy;
  22.          LCD1602_A = 0xff;
  23.          RS = 0;
  24.          RW = 1;
  25.         do{
  26.            EN = 1;
  27.                  busy = LCD1602_A;
  28.                  EN = 0;//À­µÍʹÄÜ¶Ë ±ãÓÚÏ´ÎʹÓÃ
  29.         }while(busy & 0x80);//²»ÎªÁã¾ÍÒ»Ö±Ö´ÐÐ
  30. }
  31. //º¯ÊýÃû³Æ£ºÐ´ÃüÁî
  32. //º¯Êý¹¦ÄÜ£ºÏòLCDÖÐдÈëÃüÁî
  33. void Write_cmd(uchar cmd)
  34.   {
  35.     Read_busy();
  36.           RS = 0;
  37.                 RW = 0;
  38.                 LCD1602_A = cmd;
  39.                 EN = 1;
  40.                 EN = 0;
  41. }
  42. //º¯ÊýÃû³Æ£ºÐ´Êý¾Ý
  43. //º¯Êý¹¦ÄÜ£ºÏòLCDÖÐдÈëÊý¾Ý
  44. void Write_dat(uchar dat)
  45. {
  46.   Read_busy();
  47.         RS = 1;
  48.         RW = 0;
  49.         LCD1602_A = dat;
  50.         EN = 1;
  51.         EN = 0;
  52. }
  53. //º¯ÊýÃû³Æ£ºÏÔʾһ¸ö×Ö·û
  54. //º¯Êý¹¦ÄÜ£ºÔÚÖ¸¶¨µÄλÖÃÏÔʾһ¸ö×Ö·û
  55. void Dis_onechar(uchar x, uchar y, uchar dat)
  56. {
  57.    if(y) x |= 0x40;
  58.            x |= 0x80;
  59.         Write_cmd(x);
  60.         Write_dat(dat);
  61. }
  62. //º¯ÊýÃû³Æ£ºÏÔʾһ¸ö×Ö·û´®
  63. //º¯Êý¹¦ÄÜ£ºÁ¬ÐøµÄÏÔʾ×Ö·û
  64. void Dis_str(uchar x, uchar y, uchar *str)//strÊÇÖ¸Õë±äÁ¿(µØÖ·)*strÊÇÖ¸Õë»òµØÖ·ÀïµÄÄÚÈÝ
  65. {
  66.    if(y) x |= 0x40;
  67.             x |= 0x80;
  68.          Write_cmd(x);
  69.          while(*str != '\0')
  70.          {
  71.             Write_dat(*str++);//Ö¸ÏòÏÂÒ»¸öµØÖ· µÄÄÚÈÝ
  72.          }
  73. }
  74. //º¯ÊýÃû³Æ£ºLCD³õʼ»¯
  75. //º¯Êý¹¦ÄÜ£º³õʼ»¯LCD
  76. void Init_LCD1602()
  77. {
  78.    Write_cmd(0x38);//ÉèÖÃÏÔʾģʽ
  79.          Write_cmd(0x0c);// ¿ªÏÔʾ ÏÔʾ¹â±ê ¹â±ê²»ÉÁ
  80.          Write_cmd(0x06);//µØÖ·Ö¸Õë¼ÓÒ» ¹â±ê¼ÓÒ»
  81.          Write_cmd(0x01);//ÇåÆÁ
  82. }
  83. void main()
  84. {
  85.         uchar i = 1;
  86.         uchar *p;
  87.         p = "Just do it ! ";
  88.        
  89.         Init_LCD1602();
  90.         while(*p)
  91.         {
  92.   Dis_str(i,0,*p);
  93.         i++;
  94.         P++;
  95.         delay_ms(1000);
  96.         }
  97. }
 楼主| 1154775677 发表于 2018-12-16 14:52 | 显示全部楼层
注释复制过来就乱码了
mcu5i51 发表于 2018-12-16 15:09 | 显示全部楼层
  1. void main()
  2. {
  3.         uchar i = 1;
  4.                                 uchar code str[]="Just do it ! ";
  5.         uchar *p = str;
  6.         
  7.         Init_LCD1602();
  8.         while(*p)
  9.         {
  10.                                         Dis_str(i,0,p);
  11.                                         i++;
  12.                                         p++;
  13.                                         delay_ms(1000);
  14.         }
  15. }
mcu5i51 发表于 2018-12-16 15:13 | 显示全部楼层
1. 用 char *p="...."的方式时p是不能修改的,改后就找不到这个位置了,你的程序只用了一次,当我没有说;
2.disp(u8,u8,u8*),你把*p传过去,谁知道指向哪里呀;
mcu5i51 发表于 2018-12-16 15:16 | 显示全部楼层
不对,main中是个循环,p++之后就想像不出显示什么来了;
 楼主| 1154775677 发表于 2018-12-16 18:41 来自手机 | 显示全部楼层
mcu5i51 发表于 2018-12-16 15:16
不对,main中是个循环,p++之后就想像不出显示什么来了;

感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

17

主题

48

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部