找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3050|回复: 3
收起左侧

如何将单片机程序里的lcd改成数码管?求思路

[复制链接]
ID:567505 发表于 2019-6-20 08:57 | 显示全部楼层 |阅读模式
rlc测量电容电感电阻,麻烦大神把里面的lcd程序改成数码管程序。谢谢了!

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned        int
  4. #define C1  0.045

  5. uchar code title1[]="欢迎使用          ";
  6. uchar code title2[]="LRC 万用表       ";
  7. uchar code code_L[]="电感:          ";       
  8. uchar code code_R[]="电阻:          ";
  9. uchar code code_C[]="电容:          ";
  10. uchar code code_e[]="错误:           ";
  11. uchar  num;

  12. sbit key1  =P1^0;
  13. sbit key2  =P1^1;
  14. sbit key3  =P1^2;

  15. float LZ=0;
  16. float RX=0;
  17. float CX=0;
  18. float f=0;
  19. float temp_f[4];

  20. unsigned int tt,th1,tl1;
  21. unsigned int pluse=0;       
  22. bit flag=0;       
  23. unsigned char key_num=0;

  24. #define  L  1
  25. #define  R  2
  26. #define  C  3

  27. sbit aa1 =P2^0;
  28. sbit bb1 =P2^1;

  29. #include<Lcd12864.h>

  30. void cd4051(unsigned char num)
  31. {
  32.                 switch(num)
  33. {
  34.                                 case 1: bb1=0;aa1=0;break;
  35.                                 case 2: bb1=0;aa1=1; break;
  36.                                 case 3: bb1=1;aa1=0; break;
  37.                                 default : aa1=1;aa1=1;break;
  38.                 }
  39. }
  40. void scan_key()
  41. {
  42.                 if(!key1){
  43.                                 if(!key1){
  44.                                                 while(!key1);
  45.                                                 key_num=1;
  46.                                                 cd4051(L);
  47.                                             Lcd_ShowSring(4,0,code_L);
  48.                                                 Lcd_ShowSring(1,15,"L");
  49.                                         }
  50.                 }
  51.                 if(!key2){
  52.                                 if(!key2){
  53.                                                 while(!key2);
  54.                                                 key_num=2;
  55.                                                 cd4051(R);
  56.                                                 Lcd_ShowSring(4,0,code_R);
  57.                                                 Lcd_ShowSring(1,15,"R");
  58.                                         }
  59.                 }
  60.                 if(!key3){
  61.                                 if(!key3){
  62.                                                 while(!key3);
  63.                                                 key_num=3;
  64.                                                 cd4051(C);
  65.                                                 Lcd_ShowSring(4,0,code_C);
  66.                                                 Lcd_ShowSring(1,15,"C");
  67.                                         }
  68.                 }
  69. }
  70.   void init()          //中断初始化
  71.   {          
  72.         //定时器0和定时器1都是方式1,16位定时器
  73.         //定时器设置
  74.     TMOD=0x51;                 //设置定时器0,方式1:16位定时器
  75.         TH1=0x00;         //定时器1高位装初值
  76.         TL1=0x00;         //定时器1低位装初值
  77.         ET1=1;        //定时器1          使能位
  78.        
  79.         TH0=(65535-50000)/255;          //定时器1高位装初值
  80.         TL0=(65535-50000)%255;;          //定时器1高位装初值
  81.         ET0=1;   ////定时器0          使能位
  82.         TR0=1;
  83.         TR1=1;
  84.         EA=1;//        总中断
  85. }
  86. void Measurement_L();//电感测量
  87. void Measurement_R();//电阻测量
  88. void Measurement_C();//电容测量
  89. unsigned char gather_num=0;
  90. unsigned char m_second=0;
  91. void main ()
  92. {
  93.         LCDInit();               
  94.         Lcd_ShowSring(1,0,title1);
  95.         Lcd_ShowSring(2,0,title2);
  96.         init();
  97.         while(1){       
  98.             scan_key();
  99.                 if(flag){
  100.                         flag=0;
  101.                         //在十ms里面记了这么多个脉冲
  102.                         // 那么一个脉冲的周期就是  50ms/tt  /1000  (s)   化简得到  f  20tt
  103.                         if(gather_num<4) {
  104.                                         temp_f[gather_num]=pluse*65536+256*TH1+TL1;          
  105.                                         gather_num++;
  106.                         }
  107.                         else{
  108.                                         gather_num=0;
  109.                                         f=(temp_f[0]+temp_f[1]+temp_f[2]+temp_f[3])/4.0;       
  110.                                         switch(key_num)         {
  111.                                                         case 1:Measurement_L();        break;
  112.                                                         case 2:Measurement_R(); break;
  113.                                                         case 3:Measurement_C(); break;
  114.                                                         default :break;       
  115.                                         }
  116.                         }

  117.                         TH0=(65535-50000)/255;          //定时器1高位装初值
  118.                         TL0=(65535-50000)%255;;          //定时器1高位装初值                                        
  119.                         TH1=0;                          //清零开始重新计数
  120.                         TL1=0;
  121.                         pluse=0;
  122.                         TR0=1;//开定时器计时10ms;//使能位外部中断0 数10内有多少个脉冲
  123.                         TR1=1;//进行新一轮的计数
  124.                         m_second=0;       
  125.                 }                                                                
  126.         }
  127. }
  128. void time0()interrupt 1                //定时器0 服务
  129. {       
  130.         TH0=60;          //定时器1高位装初值
  131.         TL0=235;;          //定时器1高位装初值
  132.         m_second++;
  133.         if(m_second==20){
  134.                         TR1=0;//关掉定时器1
  135.                         TR0=0; // 关掉定时器0
  136.                 m_second=0;       
  137.                 flag=1;
  138.         }               
  139. }
  140. void time1()interrupt 3                //定时器1 服务
  141. {
  142.                    pluse++;
  143.                 TH1=0;
  144.                 TL1=0;
  145. }
  146. void Measurement_L()
  147. {

  148.                         if(f==0){
  149.                                 LZ=0;
  150.                                 Lcd_ShowSring(4,0,code_L);
  151.                         }
  152.                         else {
  153.                                 LZ=5.63466627*10e10/f/f;
  154.                                 LZ=LZ/1.0727272727272727272727272727273;
  155.                                 Lcd_ShowSring(4,0,"电感:");
  156.                             Lcd_Display_u(4,4,LZ);
  157.                         }
  158.                        
  159.                         if(LZ>99999999)        {
  160.                         }                                                                                                                               
  161. }
  162. void Measurement_R()//电阻测量
  163. {               
  164.                         if(f==0){                                               
  165.                                         RX=0;                               
  166.                                 }
  167.                         else if(  0< f&& f<30) {                                                                   //1M   7

  168.                                            RX=        14400000.0/f;
  169.                                         RX= RX-3000;
  170.                                         RX  =RX/2/0.95;  //修正               
  171.                         }
  172.                         else if(f <700) {                                                                   //10k   650
  173.                                            RX=        14400000.0/f;
  174.                                         RX= RX-3000;
  175.                                         RX  =RX/2/0.95;  //修正
  176.                         }
  177.                         else if(f <1500) {                                                                   //4.7k  1209
  178.                                            RX=        14400000.0/f;
  179.                                         RX= RX-3000;
  180.                                         RX  =RX/2/0.94;  //修正       
  181.                         }
  182.                         else if(f <3000) {                                                                 //1k        2983
  183.                                            RX=        14400000.0/f;
  184.                                         RX= RX-3000;
  185.                                          RX  =RX/2/0.91;  //修正
  186.                                         //0.91286863270777479892761394101877       
  187.                         }
  188.                         else if(f <4500) {
  189.                                            RX=        14400000.0/f;
  190.                                         RX= RX-3000;
  191.                                         RX  =RX/2/0.74;  //修正       
  192.                         }
  193.                         else if(f <5000) {
  194.                                            RX=        14400000.0/f;
  195.                                         RX= RX-3000;
  196.                                                                                 //修正  100  
  197.                                         RX  =RX/2/0.50;  //修正
  198.                         }

  199.                         if(RX==0){
  200.                                         Lcd_ShowSring(4,0,code_R);
  201.                         } else{
  202.                                         Lcd_ShowSring(4,0,"电阻:");
  203.                                         Value_to_ASCII1(4,3, RX);
  204.                         }
  205.                         if(RX>99999999)        {
  206.                         //        Lcd_ShowSring(4,0,code_e);       
  207.                         }       
  208. }
  209. void Measurement_C()//C测量
  210. {
  211.                         if(f==0){                       
  212.                                         CX=0;
  213.                                         Lcd_ShowSring(4,0,code_C);                       
  214.                         }
  215.                         else if(f>5000){

  216.                                    CX=0;
  217.                                    Lcd_ShowSring(4,0,code_C);
  218.                         }
  219.                         else {
  220.                                 CX=481000.0/f/1.0276595744680851063829787234043;//修正       
  221.                                 Lcd_ShowSring(4,0,"电容:");
  222.                             Value_to_ASCIIC(4,3,CX);                                       
  223.                         }
  224.                
  225.                         if(CX>99999999)        {
  226.                         }       
  227. }



  228. ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////********************************************
  229. Description:  LCD12864 驱动 ,采用串行方式,
  230. ********************************************/
  231. //******12864**************
  232. sbit lcd_RS =    P0^2;
  233. sbit Lcd_Rw        =         P0^1;
  234. sbit Lcd_En        =         P0^0;

  235. #define BIT(n)        (1<<(n))
  236. #define SID_0   Lcd_Rw=0;
  237. #define SID_1   Lcd_Rw=1;
  238. #define SCLK_0  Lcd_En=0;
  239. #define SCLK_1  Lcd_En=1;
  240. //15脚 PSB 接低电平

  241. //函数  delay(uchar z)
  242. //功能能  延时
  243. void  Delay(uchar z)
  244. {
  245.         uchar a,b;
  246.         for(a=z;a>0;a--)
  247.          for(b=200;b>0;b--);       
  248. }

  249. void SendByte(uchar bye)
  250. {
  251.         uchar i;
  252.         for(i=0;i<8;i++)
  253.         {
  254.                 if((bye<<i)&0x80){SID_1;}
  255.                 else {SID_0;}
  256.                 SCLK_1;
  257.                 SCLK_0;
  258.         }
  259. }
  260. void Lcd_WriteCom(uchar CMD)
  261. {
  262.         SendByte(0xf8);
  263.         SendByte(CMD&0xf0);
  264.         SendByte((CMD<<4)&0xf0);
  265. }

  266. void Lcd_WriteDate(uchar Data)
  267. {        SendByte(0xf8+2);
  268.         SendByte(Data&0xf0);
  269.         SendByte((Data<<4)&0xf0);
  270. }

  271. void LCDInit()
  272. {/*        RST=0;
  273.         delay1MS(50);
  274.         RST=1;          */
  275.         lcd_RS=1;
  276.     Lcd_WriteCom(0x34);//功能设置,一次送8位数据,基本指令集
  277.     Lcd_WriteCom(0x30);//0000,1100  整体显示,游标off,游标位置off
  278.     Lcd_WriteCom(0x01);//0000,0001 清DDRAM
  279.     Lcd_WriteCom(0x06);//0000,0010 DDRAM地址归位
  280.     Lcd_WriteCom(0x0c);//1000,0000 设定DDRAM 7位地址000,0000到地址计数器AC//     
  281. }

  282. /*****************************
  283. 发送字符串
  284. *****************************/
  285. //void show_str(uchar const *s)//改AVR去掉const
  286. void  Lcd_String(const uchar  *str)
  287. { while(*str !='\0')
  288.    {
  289.                    Lcd_WriteDate(*str++);
  290.    }
  291. }
  292. ////////////////////////////////////////////////////////////////////
  293. //函数          Lcd_init(uchar com)
  294. //功能    精确屏幕显示数据
  295. //参数  line  液晶屏的第几行  list  第几个位置开始写 (最多8个列)  Date要写的数据

  296. void Lcd_Display(uchar line,uchar list,uint Date)
  297. {
  298.                 uchar i;
  299.                  uchar ta[]={0,0,0,0,0,'\0'};          //用一个数组来装数
  300.            list=list &0x07;                               //限制在 0-7列
  301.            switch(line){
  302.                                 case 1:   Lcd_WriteCom(0x80+list);break;        //第一行
  303.                                 case 2:   Lcd_WriteCom(0x90+list);break;        //第二行
  304.                                 case 3:   Lcd_WriteCom(0x88+list);break;        //第三行
  305.                                 case 4:   Lcd_WriteCom(0x98+list);break;        //第四行
  306.                                 default : break;
  307.        
  308.            }
  309.          for(i=5;i>0;i--)
  310.          {                                                          //循环四次把四个数从高到低装入ta
  311.                  ta[i-1]=Date%10+48;
  312.                 Date=Date/10;
  313.          }
  314.           Lcd_String(ta);
  315. }

  316. ////////////////////////////////////////////////////////////////////
  317. //函数          Lcd_init(uchar com)
  318. //功能    精确屏幕显示数据
  319. //参数    line  液晶屏的第几行  list  第几个位置开始写 (最多8个列)  Date要写的数据

  320. void Lcd_Display_u(uchar line,uchar list,unsigned long Date)
  321. {
  322.                 uchar i;
  323.                  uchar ta[]={0,0,0,0,0,'\0'};          //用一个数组来装数
  324.            list=list &0x07;                               //限制在 0-7列
  325.            switch(line){
  326.                                 case 1:  // Lcd_WriteCom(0x80+list);Lcd_String("        ");
  327.                                                   Lcd_WriteCom(0x80+list);break;        //第一行
  328.                                 case 2:  // Lcd_WriteCom(0x90+list);Lcd_String("        ");
  329.                                                   Lcd_WriteCom(0x90+list);break;        //第二行
  330.                                 case 3:  // Lcd_WriteCom(0x88+list);Lcd_String("        ");
  331.                                                   Lcd_WriteCom(0x88+list);break;        //第三行
  332.                                 case 4:   //Lcd_WriteCom(0x98+list);Lcd_String("        ");
  333.                                                   Lcd_WriteCom(0x98+list);break;        //第四行
  334.                                 default : break;
  335.        
  336.            }
  337.          for(i=5;i>0;i--)
  338.          {                                                          //循环四次把四个数从高到低装入ta
  339.                  ta[i-1]=Date%10+48;
  340.                 Date=Date/10;
  341.          }

  342.                                                                   //循环四次把四个数从高到低装入ta
  343.          if(ta[0]!=48){

  344.                         Lcd_WriteDate(ta[0]);
  345.                         Lcd_WriteDate(ta[1]);
  346.                         Lcd_WriteDate(ta[2]);
  347.                         Lcd_WriteDate(ta[3]);
  348.                         Lcd_WriteDate(ta[4]);
  349.                         Lcd_WriteDate('u');
  350.                 Lcd_WriteDate('H');
  351.                                
  352.         }
  353.         else{
  354.                    if(ta[1]!=48){
  355.                            Lcd_WriteDate(ta[1]);
  356.                            Lcd_WriteDate(ta[2]);
  357.                            Lcd_WriteDate(ta[3]);
  358.                            Lcd_WriteDate(ta[4]);
  359.                            Lcd_WriteDate('u');
  360.                    Lcd_WriteDate('H');
  361.                            Lcd_WriteDate(' ');


  362.                    }
  363.                    else{
  364.                                    if(ta[2]!=48){
  365.                                            Lcd_WriteDate(ta[2]);
  366.                                            Lcd_WriteDate(ta[3]);
  367.                                            Lcd_WriteDate(ta[4]);
  368.                                            Lcd_WriteDate('u');
  369.                                             Lcd_WriteDate('H');
  370.                                            Lcd_WriteDate(' ');
  371.                                            Lcd_WriteDate(' ');
  372.                                    }
  373.                                    else{
  374.                                                               if(ta[3]!=48){
  375.                                                                            Lcd_WriteDate(ta[3]);
  376.                                                                            Lcd_WriteDate(ta[4]);
  377.                                                                         Lcd_WriteDate('u');
  378.                                                                         Lcd_WriteDate('H');
  379.                                                                         Lcd_WriteDate(' ');
  380.                                                                         Lcd_WriteDate(' ');
  381.                                                                         Lcd_WriteDate(' ');
  382.                                                                   }
  383.                                                                 else{
  384.                                                                
  385.                                                                          Lcd_WriteDate(ta[4]);
  386.                                                                          Lcd_WriteDate('u');
  387.                                                                           Lcd_WriteDate('H');
  388.                                                                          Lcd_WriteDate(' ');
  389.                                                                          Lcd_WriteDate(' ');
  390.                                                                          Lcd_WriteDate(' ');
  391.                                                                          Lcd_WriteDate(' ');
  392.                                                                 }
  393.                                   
  394.                                    }                  
  395.                   
  396.                   
  397.                    }
  398.        
  399.         }
  400.                    
  401. }


  402. ////////////////////////////////////////////////////////////////////
  403. //函数          Lcd_init(uchar com)
  404. //功能    精确屏幕显示字符串
  405. //参数    line  液晶屏的第几行  list  第几个位置开始写 (最多8个列)  *p要写的字符串
  406. void  Lcd_ShowSring(uchar line,uchar list,uchar*p)
  407. {
  408.          switch(line){
  409.                                 case 1:   Lcd_WriteCom(0x80+list);break;        //第一行
  410.                                 case 2:   Lcd_WriteCom(0x90+list);break;        //第二行
  411.                                 case 3:   Lcd_WriteCom(0x88+list);break;        //第三行
  412.                                 case 4:   Lcd_WriteCom(0x98+list);break;        //第四行
  413.                                 default : break;
  414.        
  415.            }

  416.             Lcd_String(p);

  417. }

  418. void  Value_to_ASCII1(uchar line,uchar list,unsigned long value)  //欧姆级
  419. {
  420.     unsigned char temp[] = "00000000欧";

  421.         temp[0] = value/10000000%10 + 0x30;
  422.     temp[1] = value/1000000%10 + 0x30;   
  423.     temp[2] = value/100000%10 + 0x30;
  424.     temp[3] = value/10000%10 + 0x30;
  425.     temp[4] = value/1000%10 + 0x30;
  426.     temp[5] = value/100%10 + 0x30;
  427.     temp[6] = value/10%10 + 0x30;
  428.     temp[7] = value%10 + 0x30;
  429.         if(temp[0]==0x30)  {
  430.                 temp[0]=' ';
  431.                         if(temp[1]==0x30)  {
  432.                                         temp[1]=' ';
  433.                                         if(temp[2]==0x30)  {
  434.                                                         temp[2]=' ';
  435.                                                         if(temp[3]==0x30)  {
  436.                                                                 temp[3]=' ';
  437.                                                                 if(temp[4]==0x30)  {
  438.                                                                         temp[4]=' ';
  439.                                                                         if(temp[5]==0x30)  {
  440.                                                                                 temp[5]=' ';
  441.                                                                                 if(temp[6]==0x30)  {
  442.                                                                                         temp[6]=' ';       
  443.                                                                                 }                                                                                       
  444.                                                                         }                                                                               
  445.                                                                 }                                                                       
  446.                                                         }                                                                                                                       
  447.        
  448.                                         }       
  449.                         }       
  450.         }

  451.         Lcd_ShowSring( line,list,temp) ;
  452.    
  453. }

  454. void  Value_to_ASCIIC(uchar line,uchar list,unsigned long value)
  455. {
  456.     unsigned char temp[] = "00000000nF";

  457.         temp[0] = value/10000000%10 + 0x30;
  458.     temp[1] = value/1000000%10 + 0x30;   
  459.     temp[2] = value/100000%10 + 0x30;
  460.     temp[3] = value/10000%10 + 0x30;
  461.     temp[4] = value/1000%10 + 0x30;
  462.     temp[5] = value/100%10 + 0x30;
  463.     temp[6] = value/10%10 + 0x30;
  464.     temp[7] = value%10 + 0x30;
  465.         if(temp[0]==0x30)  {
  466.                 temp[0]=' ';
  467.                         if(temp[1]==0x30)  {
  468.                                         temp[1]=' ';
  469.                                         if(temp[2]==0x30)  {
  470.                                                         temp[2]=' ';
  471.                                                         if(temp[3]==0x30)  {
  472.                                                                 temp[3]=' ';
  473.                                                                 if(temp[4]==0x30)  {
  474.                                                                         temp[4]=' ';
  475.                                                                         if(temp[5]==0x30)  {
  476.                                                                                 temp[5]=' ';
  477.                                                                                 if(temp[6]==0x30)  {
  478.                                                                                         temp[6]=' ';       
  479.                                                                                 }                                                                                       
  480.                                                                         }                                                                               
  481.                                                                 }                                                                       
  482.                                                         }                                                                                                                       
  483.        
  484.                                         }       
  485.                         }       
  486.         }  
  487.    Lcd_ShowSring( line, list,temp) ;
  488. }
复制代码

所有资料51hei提供下载:
C程序.doc (63 KB, 下载次数: 7)
回复

使用道具 举报

ID:123289 发表于 2019-6-20 17:32 | 显示全部楼层
哪里会编程也,只会抄程序,数据往LCD上送,抄一段程序,OK了。
现在数据要送到LED上,傻眼了。
先画出硬件LED驱动图,再依图中LED的段位连接做译码,做好这两点你就能完成本题了。
回复

使用道具 举报

ID:568217 发表于 2019-6-20 18:50 | 显示全部楼层
看下LED有没有驱动芯片控制,有的就通过芯片控制,没有直接控制,控制之前看下共阳或者共阴极,即可。
回复

使用道具 举报

ID:473159 发表于 2019-6-20 20:46
给你个提示,网上有你这种例子,相似度有9成,你找找改改就好了。又学到技术又开界眼了,何乐而不为呢

ID:388197 发表于 2019-6-21 16:16 | 显示全部楼层
顶沙发,直接用别人的代码,不是不行,而且是最好的办法,关键得仔细看看,起码别人辛苦写的注释得认真看看吧,得知道某一块是起什么作用的. 多琢磨别人的代码,也可以试着修改别人的代码,观察修改后的运行结果等等,只有这样,自己的水平才能提高.

你这个要改用LED显示,那么跟LCD驱动之类的东西都可以不要了,自己参考Value_to_ASCII1这个函数,改写下,让他符合LED显示就行了.这个难度很低,应该初学单片机一两周就会了,具体怎么实现如果不是很清楚还是返回去看看书,琢磨一下吧.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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