一乐电子

一乐电子百科

 找回密码
 请使用微信账号登录和注册会员

QQ登录

只需一步,快速开始

快捷登录

手机号码,快捷登录

搜索
查看: 3956|回复: 32
收起左侧

[avr] 请教下M8程序中1602如何修改驱动

[复制链接]
发表于 2016-2-1 22:07 | 显示全部楼层 |阅读模式
本帖最后由 benli 于 2016-2-1 23:04 编辑

    原贴:【用M8制作电感、电容、电解电容测量仪表】:
http://www.amobbs.com/forum.php?mod=viewthread&tid=3279392

由于使用的1602是非标准的,LCD需要略加修改驱动程显示行地址,第一行0x80,0x90才能正常显示,可是找不到哪里修改


下面是程序
  1. '****************************************************
  2. '*               电感电容电解电容测量仪             *
  3. '*  电容:1P-2.5uF                                   *
  4. '*  电感:1uH-2.0H                                   *
  5. '*  电解电容:0.1uF-20000uF                          *
  6. '*                 吕军省   天津大港                *
  7. '*                 junsheng427@126.com              *
  8. '*                            20081217              *
  9. '****************************************************
  10. $regfile = "m8def.dat"
  11. $crystal = 8000000

  12. Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
  13. Config Lcd = 16 * 2

  14. Config Timer1 = Counter , Edge = Falling       '配置T/C1为计数
  15. Config Timer2 = Timer , Prescale = 64       '配置T/C2定时

  16. Config Int0 = Falling
  17. Config Timer0 = Timer , Prescale = 8
  18. On Ovf0 Tim0_isr
  19. On Int0 T1_isr

  20. On Ovf2 Tim2_isr
  21. Enable Ovf2
  22. On Ovf1 Tim1_isr
  23. Enable Ovf1
  24. Enable Interrupts
  25. Tcnt2 = &H83
  26. Start Timer2
  27. Counter1 = 0
  28. Start Counter1

  29. Dim F1 As Long
  30. Dim F2 As Long

  31. Dim C1 As Single
  32. Dim Ca1 As Single
  33. Dim Ca2 As Single
  34. Dim Cx As Single
  35. Dim L1 As Single
  36. Dim Lx As Single
  37. Dim F11 As Single

  38. Dim V1 As String * 11
  39. Dim V2 As String * 11

  40. Dim Vf As String * 6
  41. Dim Vs As String * 8
  42. Dim Z1 As String * 2

  43. Dim J As Bit
  44. Dim I As Byte
  45. Dim K As Bit
  46. Dim M As Bit
  47. Dim Vl As Byte
  48. Dim Tc As Byte
  49. Dim Tc1 As Long
  50. Dim Te As Long

  51. Ddrd.7 = 0       '键初始
  52. Portd.7 = 1
  53. Ddrd.4 = 1       '继电器初始化
  54. Ddrd.3 = 1
  55. Portd.4 = 1
  56. Portd.3 = 1

  57. Ddrd.6 = 1
  58. Portd.6 = 1
  59. J = 1
  60. K = 1
  61. M = 1
  62. I = 1
  63. Tc1 = 0
  64. Cls
  65. Cursor Off

  66. '/////主程序/////
  67. Do

  68.    '/////按键处理/////

  69.    If Pind.7 = 0 Then       'S1
  70.       Waitms 40
  71.          If Pind.7 = 0 Then
  72.             Incr I
  73.             Bitwait Pind.7 , Set
  74.          End If
  75.    End If

  76.    '/////电感L1,电容C1计算/////

  77.    If I = 1 Then
  78.       If J = 1 Then

  79.          Lcd "  L_C_CE meter"
  80.          Lowerline
  81.          Lcd "    20081217"

  82.          Waitms 1500       '等待F1计数
  83.          Portd.3 = 0       '接入标准电容C2
  84.          Waitms 1500       '等待f2计数

  85.          Ca1 = F1 * F1
  86.          Ca2 = F2 * F2
  87.          C1 = Ca1 - Ca2
  88.          C1 = Ca2 / C1
  89.          C1 = C1 * 1800       '1800是标准电容C2 ;单位pF

  90.          L1 = 3.1416 * 3.1416
  91.          L1 = L1 * 4
  92.          L1 = L1 * Ca1
  93.          L1 = L1 * C1
  94.          L1 = 1 / L1
  95.          L1 = L1 * 1000000000000000000       '单位uH

  96.          Portd.3 = 1       '断开标准电容C2
  97.       End If

  98.       J = 0

  99.       Vf = Str(f1)       '显示f1
  100.       Vf = Format(vf , "      ")
  101.       Locate 1 , 7
  102.       Lcd "F=" ; Vf ; "Hz"
  103.       Locate 1 , 1
  104.       Lcd "SetOK "

  105.       V1 = Fusing(c1 , "#.#")
  106.       V2 = Fusing(l1 , "#.#")
  107.       Locate 2 , 1
  108.       Lcd V1 ; "pF " ; V2 ; "uH"

  109.    End If

  110.    '/////电容Cx计算/////

  111.    If I = 2 Then

  112.       Vf = Str(f1)
  113.       Vf = Format(vf , "      ")
  114.       Locate 1 , 7
  115.       Lcd "F=" ; Vf ; "Hz"

  116.       F11 = F1 * F1
  117.       Cx = Ca1 / F11
  118.       Cx = Cx - 1
  119.       Cx = Cx * C1

  120.       V1 = Fusing(cx , "#.#")

  121.       Vl = Len(v1)
  122.       Z1 = "pF"

  123.       If Vl = 6 Then
  124.          V1 = Mid(v1 , 1 , 4)
  125.          Z1 = "pF"
  126.       End If

  127.       If Vl = 7 Then
  128.          V1 = Mid(v1 , 1 , 4)
  129.          V1 = Format(v1 , "00.00")
  130.          Z1 = "nF"
  131.       End If

  132.       If Vl = 8 Then
  133.          V1 = Mid(v1 , 1 , 4)
  134.          V1 = Format(v1 , "000.0")
  135.          Z1 = "nF"
  136.       End If

  137.       If Vl = 9 Then
  138.          V1 = Mid(v1 , 1 , 4)
  139.          V1 = Format(v1 , "0.000")
  140.          Z1 = "uF"
  141.       End If

  142.       Vs = Space(8)
  143.       Locate 2 , 1
  144.       Lcd "   Cx=" ; V1 ; Z1 ; Vs

  145.       Locate 1 , 1
  146.       Lcd "TestC "

  147.    End If

  148.    '/////电感Lx计算/////

  149.    If I = 3 Then

  150.       Vf = Str(f1)
  151.       Vf = Format(vf , "      ")
  152.       If F1 < 50 Then
  153.          Vf = "     0"
  154.       End If
  155.       Locate 1 , 7
  156.       Lcd "F=" ; Vf ; "Hz"

  157.       Portd.4 = 0       '输入端切换到测电感

  158.       If F1 > 1000 Then
  159.          F11 = F1 * F1
  160.          Lx = Ca1 / F11
  161.          Lx = Lx - 1
  162.          Lx = Lx * L1
  163.       Else
  164.          Lx = 0
  165.       End If
  166.       V1 = Fusing(lx , "#.##")
  167.       Vl = Len(v1)
  168.       Z1 = "uH"

  169.       If Vl = 6 Then
  170.          V1 = Mid(v1 , 1 , 5)
  171.          Z1 = "uH"
  172.       End If

  173.       If Vl = 7 Then
  174.          V1 = Mid(v1 , 1 , 4)
  175.          V1 = Format(v1 , "0.000")
  176.          Z1 = "mH"
  177.       End If

  178.       If Vl = 8 Then
  179.          V1 = Mid(v1 , 1 , 4)
  180.          V1 = Format(v1 , "00.00")
  181.          Z1 = "mH"
  182.       End If

  183.       If Vl = 9 Then
  184.          V1 = Mid(v1 , 1 , 4)
  185.          V1 = Format(v1 , "000.0")
  186.          Z1 = "mH"
  187.       End If

  188.       If Vl = 10 Then
  189.          V1 = Mid(v1 , 1 , 4)
  190.          V1 = Format(v1 , "0.000")
  191.          Z1 = "H "
  192.       End If

  193.       Vs = Space(8)
  194.       Locate 2 , 1
  195.       Lcd "   Lx=" ; V1 ; Z1 ; Vs

  196.       Locate 1 , 1
  197.       Lcd "TestL "

  198.    End If

  199.    '/////电解电容器测量(<500uF) /////

  200.    If I = 4 Then
  201.       Portd.4 = 1
  202.       If K = 1 Then

  203.          Disable Ovf1
  204.          Disable Ovf2

  205.          Enable Int0
  206.          Enable Ovf0

  207.          Locate 1 , 1
  208.          Lcd "TestCE  [<500uF]"
  209.          Locate 2 , 1
  210.          Lcd "   CEx=       "

  211.       End If
  212.       K = 0

  213.    Portd.6 = 0       '开始充电
  214.    Start Timer0       '开始计时
  215.    End If

  216.    '/////电解电容测量(2) /////

  217.    If I = 5 Then

  218.       If M = 1 Then
  219.          Portd.3 = 0
  220.          Locate 1 , 1
  221.          Lcd "TestCE  [>500uF]"
  222.          Locate 2 , 1
  223.          Lcd "   CEx=       "
  224.       End If
  225.       M = 0
  226.       Portd.6 = 0       '开始充电
  227.       Start Timer0       '开始计时
  228.    End If


  229. '/////返回到电容测量//////

  230.    If I = 6 Then

  231.       I = 2       '返回到电容测量

  232.       Enable Ovf1
  233.       Enable Ovf2

  234.       Disable Int0
  235.       Disable Ovf0

  236.       Portd.3 = 1
  237.       K = 1
  238.       M = 1
  239.    End If

  240. Loop
  241. End

  242. '/////计数中断/////

  243. Tim1_isr:

  244.    Incr Tc1       '这么作可使计数分辩率最高到1Hz

  245. Return

  246. '/////定时中断/////

  247. Tim2_isr:

  248.    Tcnt2 = &H83       '定时器T2初值
  249.    Incr Tc
  250.    If Tc = 250 Then       '定时250mS
  251.       Stop Counter1
  252.       Tc1 = Tc1 * 65535
  253.       If Portd.3 = 1 Then
  254.          F1 = Counter1
  255.          F1 = F1 + Tc1
  256.          F1 = F1 * 4
  257.       End If
  258.       If Portd.3 = 0 Then
  259.          F2 = Counter1
  260.          F2 = F2 + Tc1
  261.          F2 = F2 * 4
  262.       End If
  263.       Counter1 = 0
  264.       Start Counter1
  265.       Tc = 0
  266.       Tc1 = 0
  267.    End If

  268. Return

  269. '/////定时中断,测电解电容/////

  270. Tim0_isr:

  271.    Incr Te       '定时器0中断次数

  272. Return

  273. '/////外部中断,测电解电容/////

  274. T1_isr:

  275.    Stop Timer0

  276.    Te = Te * 256
  277.    Te = Te + Tcnt0
  278.    Te = Te / 2       '时间/充电电阻=被测电容

  279.    V1 = Str(te)
  280.    Vl = Len(v1)

  281.    If Portd.3 = 1 Then       '充电电阻R9接入,<500uF

  282.        If Vl = 2 Then
  283.           V1 = "NO"
  284.        End If

  285.        If Vl = 3 Then
  286.           V1 = Mid(v1 , 1 , 3)
  287.           V1 = Format(v1 , "0.000")
  288.        End If

  289.        If Vl = 4 Then
  290.           V1 = Mid(v1 , 1 , 3)
  291.           V1 = Format(v1 , "0.00")
  292.        End If

  293.        If Vl = 5 Then
  294.           V1 = Mid(v1 , 1 , 3)
  295.           V1 = Format(v1 , "0.0")
  296.        End If

  297.        If Vl = 6 Then
  298.           V1 = Mid(v1 , 1 , 3)
  299.        End If

  300.        If Vl = 7 Then
  301.           V1 = "  OL  "
  302.        End If

  303.    End If

  304.    If Portd.3 = 0 Then

  305.       If Vl = 2 Then
  306.          V1 = Mid(v1 , 1 , 2)
  307.          V1 = Format(v1 , "0.00")
  308.       End If

  309.       If Vl = 3 Then
  310.          V1 = Mid(v1 , 1 , 3)
  311.          V1 = Format(v1 , "0.00")
  312.       End If

  313.       If Vl = 4 Then
  314.          V1 = Mid(v1 , 1 , 2)
  315.       End If

  316.       If Vl = 5 Then
  317.          V1 = Mid(v1 , 1 , 3)
  318.       End If

  319.       If Vl = 6 Then
  320.          V1 = Mid(v1 , 1 , 4)
  321.       End If

  322.       If Vl = 7 Then
  323.          V1 = Mid(v1 , 1 , 5)
  324.       End If
  325.    End If

  326.    Vs = Space(7)

  327.    If Te > 1 And Te < 10 Then

  328.       Locate 2 , 1
  329.       Lcd "   CEx=" ; "0" ; "uF" ; Vs

  330.    End If

  331.    If Te > 10 Then

  332.       Locate 2 , 1
  333.       Lcd "   CEx=" ; V1 ; "uF" ; Vs

  334.    End If

  335.    Portd.6 = 1       '开始放电

  336.    If Portd.3 = 1 And Te > 10 Then
  337.       Waitms 100
  338.    End If
  339.    If Portd.3 = 0 And Te > 10 Then
  340.       Waitms 500
  341.    End If

  342.    Tcnt0 = 0       '定时计数器清零
  343.    Te = 0       '定时中断次数清零

  344. Return
复制代码
发表于 2016-2-1 23:42 | 显示全部楼层
本帖最后由 桃之夭夭 于 2016-2-1 23:46 编辑

源程序没有显示部分的代码~自己找个1602的对照写一下~
许老师的电桥不比这个好?还有C的源码……
发表于 2016-2-1 23:50 | 显示全部楼层
本帖最后由 桃之夭夭 于 2016-2-1 23:51 编辑

             lcd1602写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) //x代表列,y代表行
{     
         if (y == 1) //y==1代表显示在LCD1602第一行
                 {     
                 LCD_Write_Com(0x80 + x);     //表示第一行
                 }
         else                 //否则就是第二行,就是必须y==2
                 {      
                 LCD_Write_Com(0xC0 + x);      //表示第二行
                 }        
         while (*s)
                 {     
                         LCD_Write_Data( *s);     //写入字符
                         s ++;                             //指向下一个地址
                 }
}

说的是这个里面的~可以参考C:
http://wenku.baidu.com/link?url= ... qrgMBLAIoZqR9c5gt2G
发表于 2016-2-2 06:28 | 显示全部楼层
这个是BASIC AVR写的,基本函数在函数库里。
 楼主| 发表于 2016-2-2 08:04 来自手机 | 显示全部楼层
桃之夭夭 发表于 2016-2-1 23:42
源程序没有显示部分的代码~自己找个1602的对照写一下~
许老师的电桥不比这个好?还有C的源码……

这个硬件做好了,就是换个1602,
 楼主| 发表于 2016-2-2 08:07 来自手机 | 显示全部楼层
桃之夭夭 发表于 2016-2-1 23:42
源程序没有显示部分的代码~自己找个1602的对照写一下~
许老师的电桥不比这个好?还有C的源码……

这个硬件做好了,就是换个1602,
 楼主| 发表于 2016-2-2 08:09 来自手机 | 显示全部楼层
fujiachun 发表于 2016-2-2 06:28
这个是BASIC AVR写的,基本函数在函数库里。

傅老师知道如何修改吗?
发表于 2016-2-2 08:27 | 显示全部楼层
建议楼主学C语言,嵌入式用bisic各种蛋疼
 楼主| 发表于 2016-2-2 09:27 | 显示全部楼层
luckroll 发表于 2016-2-2 08:27
建议楼主学C语言,嵌入式用bisic各种蛋疼

C程序还好解决,这个摸不到头脑
发表于 2016-2-2 12:12 | 显示全部楼层
benli 发表于 2016-2-2 08:07
这个硬件做好了,就是换个1602,

不是换个硬件……是作者没有给你这个源代码,只给你部分代码~

本版积分规则

QQ|一淘宝店|手机版|商店|电子DIY套件|一乐电子 ( 粤ICP备09076165号 ) 公安备案粤公网安备 44522102000183号

GMT+8, 2024-5-18 06:24 , Processed in 0.073134 second(s), 34 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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