论坛风格切换切换到宽版
  • 4380阅读
  • 15回复

在KN830上做单片机实验(后续实验,将只发表在本人的博客上,以增加广告收入 :D ) [复制链接]

上一主题 下一主题
离线BG4UVR
 
发帖
11288
只看楼主 倒序阅读 0楼 发表于: 2006-10-30
补充说明:
后续实验,将只发表在本人的博客上,以增加广告收入 :d

嘿嘿,6bf&6agb老师可千万别骂我   (如果认为不合适,请通知我,我会把本帖删除 )

有朋友想学单片机,没有学习板。那就先在kn830上试吧,理论上说,你再刷回原来的程序,仍可以完全正常工作。(但不保证不会出意外,所以,如果你kn830烧了,本人可不负责

今天来lcm1602显示实验,照旧,废话少说,上代码

main.c
这只是个示例,告诉你lcm1602.c如何来使用
  1. #include <at89x52.h>
  2. #include <intrins.h>
  3. #include "lcm1602.c"                                    
  4. #define on 0;
  5. #define off 1;
  6. sbit power=p3^2;
  7. void power_on(void);
  8. main()
  9. {
  10.      power_on();
  11.      displaylistchar(0,0,"kn830 ver:bg4uvr");
  12.      displaylistchar(0,1,"=ba6bf & bg6agb=");
  13.      delayms(1000);
  14.      lcm_cls();
  15.      displaylistchar(0,0,"vfo xx.xxx.xx l");
  16.      displaylistchar(0,1,"mod step att vol");
  17.      while(1);
  18. }
  19. //开电源的函数。
  20. void power_on(void){
  21.      power=on; //要是不用它,你是永远也看不到显示的。
  22.      lcm_lamp=on;//背光,开还是关,自己看着办。=off就关。
  23.      lcminit();
  24. }


lcm1602.c
  1. //照例,仍然是修改于“明浩”的8位模式代码
  2. //注意:由于使用了ls164来串行发送需要的数据,所以硬件上决定了你是无法去读出
  3. //lcm状态的。所以本程序没有读忙信号,而使用了延时。时间有点长,一般没什么影
  4. //响,如果觉得太慢了,请自己修改为合适的时间。
  5. //发送的ls164的数据为先高位后低位
  6. //lcm1602的引引脚定义
  7. sbit lcm_rs=p2^2;
  8. sbit lcm_rw=p2^1;
  9. sbit lcm_e=p2^0;
  10. sbit lcm_lamp=p2^6;
  11. //ls164的串行输入脚定义
  12. sbit dspkey_clk=p2^4;
  13. sbit dspkey_data=p2^3;
  14. //显示函数声明
  15. void writedatalcm(unsigned char wdlcm);
  16. void writecommandlcm(unsigned char wclcm);
  17. void lcminit(void);
  18. void lcm_cls(void);
  19. void displayonechar(unsigned char x, unsigned char y, unsigned char ddata);
  20. void displaylistchar(unsigned char x, unsigned char y, unsigned char code *ddata);
  21. void delayms(unsigned int ms);
  22. //通过ls164串行发送8位数据
  23. //没用nop? 当然,164可比eeprom或者lcm速度快多了
  24. void lcm_senddata(unsigned char dispdata){
  25.      unsigned char i;
  26.      for(i=0;i<8;i++){
  27.            dspkey_clk=0;
  28.            dspkey_data=dispdata&0x80;
  29.            dspkey_clk=1;
  30.            dispdata<<=1;
  31.      }
  32. }
  33. //写数据
  34. void writedatalcm(unsigned char wdlcm)
  35. {
  36.      delayms(1);
  37.      lcm_senddata(wdlcm);
  38.      lcm_rs = 1;
  39.      lcm_rw = 0;
  40.      lcm_e = 0; //若晶振速度太高可以在这后加小的延时
  41.      lcm_e = 0; //延时
  42.      lcm_e = 1;
  43. }
  44. //写指令
  45. void writecommandlcm(unsigned char wclcm) //buysc为0时忽略忙检测
  46. {
  47.      delayms(1);
  48.      lcm_senddata(wclcm);
  49.      lcm_rs = 0;
  50.      lcm_rw = 0;
  51.      lcm_e = 0;
  52.      lcm_e = 0;
  53.      lcm_e = 1;
  54. }
  55. //lcm初始化
  56. void lcminit(void)
  57. {
  58.      lcm_senddata(0);
  59.      writecommandlcm(0x38); //三次显示模式设置,不检测忙信号
  60.      delayms(5);
  61.      writecommandlcm(0x38);
  62.      delayms(5);
  63.      writecommandlcm(0x38);
  64.      delayms(5);
  65.      writecommandlcm(0x38); //显示模式设置,开始要求每次检测忙信号
  66.      writecommandlcm(0x08); //关闭显示
  67.      writecommandlcm(0x01); //显示清屏
  68.      writecommandlcm(0x06); //显示光标移动设置
  69.      writecommandlcm(0x0c); //显示开及光标设置
  70. }
  71. //按指定位置显示一个字符
  72. void displayonechar(unsigned char x, unsigned char y, unsigned char ddata)
  73. {
  74.      y &= 0x1;
  75.      x &= 0xf; //限制x不能大于15,y不能大于1
  76.      if (y) x |= 0x40; //当要显示第二行时地址码+0x40;
  77.      x |= 0x80; //算出指令码
  78.      writecommandlcm(x); //发送地址码
  79.      writedatalcm(ddata);
  80. }
  81. //按指定位置显示一串字符
  82. void displaylistchar(unsigned char x, unsigned char y, unsigned char code *ddata)
  83. {
  84.      y &= 0x1;
  85.      x &= 0xf; //限制x不能大于15,y不能大于1
  86.      if (y) x |= 0x40; //当要显示第二行时地址码+0x40;
  87.      x |= 0x80; //算出指令码
  88.      writecommandlcm(x); //发送地址码
  89.      while (*ddata) //若到达字串尾则退出
  90.      {
  91.            writedatalcm(*ddata);
  92.            ddata++;            
  93.      }
  94. }
  95. void lcm_cls(void){
  96.      writecommandlcm(0x01);
  97. }
  98. //1ms延时程序
  99. void delayms(unsigned int ms)      
  100. {
  101.      unsigned char i;
  102.      while(ms--)
  103.      {
  104.            for(i = 0; i < 115; i++);
  105.      }
  106. }
离线xiaolei_200
发帖
559
只看该作者 1楼 发表于: 2006-10-30
不错,继续呀,这可以是单片机学习的开始呀,哎agb 6bf别拍我们啊
离线BG6AGB
发帖
915
只看该作者 2楼 发表于: 2006-10-30
[quote=xiaolei_200]不错,继续呀,这可以是单片机学习的开始呀,哎agb 6bf别拍我们啊[/quote]

拍的就是你,有呼号了也不改id。那你呼号干啥用的?
离线bg4iww
发帖
8700
只看该作者 3楼 发表于: 2006-10-30
agb能否给个kn830的源程序学习一下?呵呵,我想把我的kn830改造一下,重写一下程序。如果涉及版权问题的话就算了。谢谢
离线BG3MVR
发帖
463
只看该作者 4楼 发表于: 2006-10-30
我也想要源程序.不过估计够呛!呵呵!
离线BG4XDO
发帖
1124
只看该作者 5楼 发表于: 2006-10-30
94 94
离线BG4UVR
发帖
11288
只看该作者 6楼 发表于: 2006-10-30
源程序是人家辛苦劳动的结果,哪能张口就要啊……

自己试着写个吧 :d
离线bg4iww
发帖
8700
只看该作者 7楼 发表于: 2006-10-30
是啊,别人写程序肯定是付出汗水的。不过自己写肯定也不容易啦,何况kn830的代码长度很长。站在巨人的肩膀上离成功会更近!
离线bellstudio
发帖
2820
只看该作者 8楼 发表于: 2006-10-30
如果楼上写完了和kn小组共享的话,估计人家会考虑的:p
离线bg4iww
发帖
8700
只看该作者 9楼 发表于: 2006-10-30
呵呵,我写的程序太烂,估计人家不会看我写的狗屁代码的,嘿嘿
离线代洪波
发帖
4809
只看该作者 10楼 发表于: 2006-11-02
其实通过了解他机器的操作功能来反推程序也不是很难啊!
离线elecele
发帖
894
只看该作者 11楼 发表于: 2006-11-06
[quote=代洪波]其实通过了解他机器的操作功能来反推程序也不是很难啊![/quote]
有人自己写的过后都看不懂,我看你说的难了。
离线ding
发帖
3488
只看该作者 12楼 发表于: 2006-11-10
南京,回来了.来看看进展.....
怎么uvr,没有发新贴?!
离线efree
发帖
554
只看该作者 13楼 发表于: 2006-11-25
继续实验啊,鼓励,支持,赞!
离线BG4UVR
发帖
11288
只看该作者 14楼 发表于: 2006-11-25
'
继续实验啊,鼓励,支持,赞!
'

中间碰到了一个问题,用了一周时间也没解决掉,加上目前工作非常忙碌,暂时放下了。有空接着来。
离线bd4mm
发帖
720
只看该作者 15楼 发表于: 2006-12-23
博客作的不错