树莓派论坛

 找回密码
 立即注册

12864显示屏控制程序,不显示,求高手 给检查下原因

沙漠农场 发表于 2017-10-14 17:52:22 | 显示全部楼层 |阅读模式
我是把一个8051的c语言程序翻译成 python程序的:
python程序如下:
  1. #!/usr/bin/env python3
  2. # encoding: utf-8

  3. import RPi.GPIO as GPIO
  4. import time

  5. #psb接高电平

  6. RS = 17


  7. #E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令
  8. E = 27

  9. RES = 18

  10. #WRD is RW
  11. WRD = 21

  12. DPIN = (22,23,24,25,12,16,5,6)


  13. HANZI_STR="hello you hello you hello you hello you hello you hello you hello you hello you "

  14. def main():
  15.     init0()
  16.     initial()
  17.     byte_array = bytes(HANZI_STR,'gb18030')
  18.     lcd_mesg(byte_array)
  19.     time.sleep(3)

  20. def init0():
  21.     GPIO.setwarnings(False)
  22.     GPIO.setmode(GPIO.BCM)
  23.     GPIO.setup(RS, GPIO.OUT)
  24.     GPIO.setup(E, GPIO.OUT)
  25.    
  26.     GPIO.setup(RES, GPIO.OUT)
  27.     GPIO.setup(WRD, GPIO.OUT)
  28.    
  29.     for pin in DPIN:
  30.         print(pin)
  31.         GPIO.setup(pin, GPIO.OUT)

  32. def initial():
  33.    
  34.     GPIO.output(RES,0)
  35.     time.sleep(0.01)
  36.    
  37.     GPIO.output(RES,1)
  38.     time.sleep(0.01)

  39.     TransferData(0x30,0)
  40.     time.sleep(0.01)

  41.     TransferData(0x30,0)
  42.     time.sleep(0.01)

  43.     TransferData(0x08,0)
  44.     time.sleep(0.01)

  45.     TransferData(0x10,0)
  46.     time.sleep(0.01)

  47.     TransferData(0x0C,0)
  48.     time.sleep(0.01)

  49.     TransferData(0x01,0)
  50.     time.sleep(0.01)

  51.     TransferData(0x06,0)
  52.     time.sleep(0.01)
  53.    

  54. def lcd_mesg(str):
  55.     TransferData(0x80,0)
  56.     time.sleep(0.01)
  57.     for i in range(32):
  58.         TransferData(str[i],1)

  59.     TransferData(0x90,0)
  60.     time.sleep(0.01)

  61.     for i in range(32,64):
  62.         TransferData(str[i],1)


  63. def TransferData(byte,di):
  64.     GPIO.output(WRD,0)
  65.     GPIO.output(RS,di)
  66.     time.sleep(0.001)
  67.     dataout(byte)
  68.     GPIO.output(E,1)
  69.     time.sleep(0.001)
  70.     GPIO.output(E,0)
  71.    
  72. #output to dpin
  73. def dataout(byte):
  74.     x = 0x01
  75.     for n in range(8):
  76.         if byte&x == x:
  77.             GPIO.output(DPIN[n], 1)
  78.         else:
  79.             GPIO.output(DPIN[n], 0)
  80.         x<<1
  81.         
  82. if __name__ == '__main__':
  83.     try:
  84.         main()
  85.     except KeyboardInterrupt:
  86.         pass
  87.     finally:
  88.         print('cleaning')
  89.         
  90.    
复制代码
原来的c语言程序如下:
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <reg52.h>
  4. #include <string.h>

  5. unsigned char code IC_DAT[];
  6. unsigned char code pic1[];
  7. unsigned char code pic2[];
  8. unsigned char code pic3[];


  9. sbit    RS =P2^0;
  10. sbit    WRD=P2^1;
  11. sbit    E=  P2^2;
  12. sbit    PSB=P2^4;
  13. sbit    RES=P2^5;


  14. void    TransferData(char data1,bit DI);
  15. void    display(void);
  16. void    display_grapic(void);
  17. void    delayms(unsigned int n);
  18. void    DisplayLine(unsigned char line1,unsigned char line2);
  19. void    DisplayGraphic(unsigned char code *adder);
  20. void    delay(unsigned int m);
  21. void    lcd_mesg(unsigned char code *adder1);


  22. unsigned char code IC_DAT[]={
  23.                                                         "泉州海创电子科技"  
  24.                                                         "单片机开发板系列"
  25.                                                         "中文字库测试程序"
  26.                                                         "恭喜发财身体健康"
  27.                                                         };
  28. unsigned char code IC_DAT2[]={
  29.                                                         "海纳百川宽容为先"
  30.                                                         "欲成大业诚信为先"
  31.                                                         "游弋商海济世为先"
  32.                                                         "人立于世守法为先"
  33.                                                         };

  34. void initinal(void)           //LCD字库初始化程序
  35. {
  36.         delay(40);             //大于40MS的延时程序
  37.         PSB=1;                 //设置为8BIT并口工作模式
  38.         delay(1);              //延时
  39.         RES=0;                 //复位
  40.         delay(1);              //延时
  41.         RES=1;                 //复位置高
  42.         delay(10);
  43.         TransferData(0x30,0);  //Extended Function Set :8BIT设置,RE=0: basic instruction set, G=0 :graphic display OFF
  44.         delay(100);            //大于100uS的延时程序
  45.         TransferData(0x30,0);  //Function Set
  46.         delay(37);             ////大于37uS的延时程序
  47.         TransferData(0x08,0);  //Display on Control
  48.         delay(100);            //大于100uS的延时程序
  49.         TransferData(0x10,0);  //Cursor Display Control光标设置
  50.         delay(100);            //大于100uS的延时程序
  51.         TransferData(0x0C,0);  //Display Control,D=1,显示开
  52.         delay(100);            //大于100uS的延时程序
  53.         TransferData(0x01,0);  //Display Clear
  54.         delay(10);             //大于10mS的延时程序
  55.         TransferData(0x06,0);  //Enry Mode Set,光标从右向左加1位移动
  56.         delay(100);            //大于100uS的延时程序
  57. }


  58. void initina2(void)           //LCD显示图片(扩展)初始化程序
  59. {
  60.         delay(40);             //大于40MS的延时程序
  61.         PSB=1;                 //设置为8BIT并口工作模式
  62.         delay(1);              //延时
  63.         RES=0;                 //复位
  64.         delay(1);              //延时
  65.         RES=1;                 //复位置高
  66.         delay(10);
  67.        
  68.         TransferData(0x36,0);  //Extended Function Set RE=1: extended instruction
  69.         delay(100);            //大于100uS的延时程序
  70.         TransferData(0x36,0);  //Extended Function Set:RE=1: extended instruction set
  71.         delay(37);             ////大于37uS的延时程序
  72.         TransferData(0x3E,0);  //EXFUNCTION(DL=8BITS,RE=1,G=1)
  73.         delay(100);            //大于100uS的延时程序
  74.         TransferData(0x01,0);  //CLEAR SCREEN
  75.         delay(100);            //大于100uS的延时程序
  76. }


  77. void main(void)
  78. {
  79.         while(1)
  80.         {
  81.                 initina2();            //调用LCD显示图片(扩展)初始化程序
  82.                
  83.                 DisplayGraphic(pic2);  //显示图片2
  84.                 delayms(200);
  85.                
  86.                 DisplayGraphic(pic3);  //显示图片3
  87.                 delayms(200);
  88.                
  89.                 initinal();                    //调用LCD字库初始化程序
  90.                 delay(100);            //大于100uS的延时程序
  91.                 lcd_mesg(IC_DAT);      //显示中文汉字1
  92.                 delayms(240);
  93.                 delayms(240);
  94.                
  95.                 initinal();                    //调用LCD字库初始化程序
  96.                 delay(100);            //大于100uS的延时程序
  97.                 lcd_mesg(IC_DAT2);     //显示中文汉字2
  98.                 delayms(240);
  99.                 delayms(240);
  100.         }
  101. }



  102. void lcd_mesg(unsigned char code *adder1)
  103. {
  104.         unsigned char i;
  105.         TransferData(0x80,0);  //Set Graphic Display RAM Address
  106.         delay(100);
  107.         for(i=0;i<32;i++)
  108.         {
  109.                 TransferData(*adder1,1);
  110.                 adder1++;
  111.         }
  112.        
  113.         TransferData(0x90,0);  //Set Graphic Display RAM Address
  114.         delay(100);
  115.         for(i=32;i<64;i++)
  116.         {
  117.                 TransferData(*adder1,1);
  118.                 adder1++;
  119.         }
  120. }




  121. void  TransferData(char data1,bit DI)  //传送数据或者命令,当DI=0是,传送命令,当DI=1,传送数据.
  122. {
  123.         WRD=0;
  124.         RS=DI;
  125.         delay(1);
  126.         P0=data1;
  127.         E=1;
  128.         delay(1);
  129.         E=0;
  130. }

  131. void delayms(unsigned int n)            //延时10×n毫秒程序
  132. {
  133.         unsigned int i,j;
  134.         for(i=0;i<n;i++)
  135.         for(j=0;j<2000;j++);
  136. }

  137. void delay(unsigned int m)            //延时程序
  138. {
  139.         unsigned int i,j;
  140.         for(i=0;i<m;i++)
  141.         for(j=0;j<10;j++);
  142. }

  143. void DisplayGraphic(unsigned char code *adder)
  144. {
  145.         int i,j;
  146.         //*******显示上半屏内容设置
  147.         for(i=0;i<32;i++)              //
  148.         {
  149.                 TransferData((0x80 + i),0); //SET  垂直地址 VERTICAL ADD
  150.                 TransferData(0x80,0);       //SET  水平地址 HORIZONTAL ADD
  151.                 for(j=0;j<16;j++)
  152.                 {
  153.                         TransferData(*adder,1);
  154.                         adder++;
  155.                 }
  156.         }
  157.         //*******显示下半屏内容设置
  158.         for(i=0;i<32;i++)              //
  159.         {
  160.                 TransferData((0x80 + i),0); //SET 垂直地址 VERTICAL ADD
  161.                 TransferData(0x88,0);       //SET 水平地址 HORIZONTAL ADD
  162.                 for(j=0;j<16;j++)
  163.                 {
  164.                 TransferData(*adder,1);
  165.                 adder++;
  166.                 }
  167.         }
  168. }
复制代码


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

本版积分规则

手机版 | Archiver | 树莓派论坛 ( 粤ICP备15075382号-1 )