EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2009/7/10 16:07:47

3

关于投票

Mega16读取SD卡内的FAT16文件

最近一直在学习FAT文件系统,在网络上找了一些资料加上参考别人写的程序,现在已经可以读取SD/MMC卡指定的文件,有些东西自己也不是很懂,回头还得慢慢研究。

程序比较简单,就是读取SD卡的基本信息和初始化文件系统,然后再把读到的文本文件送串口显示,现在只能是读文件,下一步再加上写和删除文件。

点击看大图

GCC代码:http://space.ednchina.com/upload/2009/7/10/ac7f3443-cb91-465b-96dd-980b57a0f1d4.rar

 

系统分类: 单片机  |  用户分类: AVR  |  标签: SD FAT16 Mega16 AVR  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1124) | 回复(1)

发表于 2009/4/8 11:33:44

2

关于投票

Mega16 Bootloader+PC端上位机

AVR的Bootloader功能很方便产品的在线升级,以前参考网上的资料写过下位机的程序,标准的XMODEM协议,用超级终端来升级程序。最近在学习C#,所以用C#写个简单的上位机软件,配合以前的bootloader程序实现在线升级。下位机用的Mega16, 实验效果还行,但是比较简单,离实际应用还差很远。

上位机编译环境:C#2008 Express       工程代码:http://space.ednchina.com/upload/2009/4/8/c48f3f71-a2eb-45d2-94a7-b8233ffed606.rar

下位机编译环境:WinAVR                   工程代码:http://space.ednchina.com/upload/2009/4/8/14048d26-6afb-4d48-9b26-14837b2312c7.rar

系统分类: 单片机  |  用户分类: AVR  |  标签: BootLoader Mega16 AVR 上位机 C#  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(970) | 回复(3)

发表于 2009/1/21 16:41:37

0

关于投票

Mega16热敏电阻测温上位机曲线显示

最近在一直学习用C#做上位机,把以前的做的m16热敏电阻测温的程序翻出来,稍加修改通过串口发给PC;PC端用c#2008写程序,接收数据后通过ZedGraph绘图控件实时显示出曲线图。ZedGraph这个开源控件真是好用,很方便,不过介绍都是英文的,网络上也简单使用的方法,看后也能绘出图形。

这是年前最后一次发贴了,再过两天就回老家过年了,就当新年礼物送给大家啦,哈哈!

硬件电路:电路很简单,就不再画了,一个5K电阻传5K的热敏电阻到地,中间送m16的ADC0。

软件截图:

点击看大图

上位机源码:http://space.ednchina.com/upload/2009/1/21/2201148d-7aa2-4aef-856c-d6010fbd0cc6.rar

下位机源码:http://space.ednchina.com/upload/2009/1/21/6c562d61-c65c-4832-97ab-0065594f2052.rar

系统分类: 单片机  |  用户分类: AVR  |  标签: Mega16 热面电阻 测温 上位机 C# 曲线  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1104) | 回复(5)

发表于 2008/11/26 21:03:57

4

关于投票

Mega16驱动5110液晶来玩贪吃蛇

硬件环境:
       MCU用的Mega16内部RC 8M,液晶是诺基亚5110的液晶模块(在网上买的)跟邮购部3310液晶的驱动方式一样。游戏思路参考的傻孩子书里面,程序还不太完善,有错误的地方还请大家指出,运行速度感觉还行!
电路很简单就不在说了 ,应为我自己也没画图,就是单片机的ISP口液晶模块,然后是4个按键接到IO口上。
软件环境:
      WINAVR GCC

图片:

点击看大图

游戏开始界面

点击看大图

游戏中

点击看大图

Game Over

项目源码: http://space.ednchina.com/upload/2008/11/26/6cd7e877-93c6-4bba-8b36-8bd7d8554b3d.rar

系统分类: 单片机  |  用户分类: AVR  |  标签: 贪吃蛇 mega16 5110 液晶  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1482) | 回复(2)

发表于 2008/11/17 15:15:17

2

关于投票

[原创]Mega16驱动5110液晶

前一段时间在网上买了两块Nokia 5110的液晶模块,参考了网上的一些例子自己也可驱动了,这款液晶模块驱动方便,体积也很小,很适合试验调试的时候做显示终端来用,淘宝很多商家都有的卖。

现在程序可以显示一幅图片,ASIIC字符和12x12的中文汉字 ,不过你的自己做字库,字库软件网上很多。看下显示效果吧:

点击看大图

点击看大图

主程序:pdf

系统分类: 单片机  |  用户分类: AVR  |  标签: 5110液晶 驱动 Meag16  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(899) | 回复(0)

发表于 2008/9/15 16:47:36

6

关于投票

[原创]Mega16硬件SPI驱动12位AD芯片TLC2543

TLC2543是TI的一片12位AD芯片,11通道AD转换,数据传输符合SPI串行方式,是常用的高精度AD芯片,价格有点贵了35一片,不过物有所值,在实验中读书还是很稳定的。TLC2543的操作也很简单,命令格式:通道+精度+数据顺序,不过值得注意的:是本次读取的值是上次转换的AD值,也就是说本次发送的命令是启动下一次转换同时读取上次转换的值。

老规矩看图片:

点击看大图

硬件电路是AVR的Mega16,用硬件SPI方式驱动TLC2543,不过SPI的速度比能太快否则读不到数据,我这里用Fmcu/8,(Fmcu = 7.378628M)。程序中的16精度其实有效只有12位,TLC2543是为了方便SPI的传输方式专门照顾的方式,应为SPI传输的都是8BIT字节的整数倍。

点击看大图

只是同过串口调试助手观察通道0的电压值,还是比较准确,虽然我的参考电压直接接的VCC。

工程源代码下载:

编译环境 :AVRStudio + WinAVR 20070525http://space.ednchina.com/upload/2008/9/15/3c05eaec-67b7-4df2-9018-7d27eff5bab0.rar

代码里只是简单的测试了通道0,要测量其它通道只需调用相关函数即可。

附TLC2453中文手册(感谢AVR与虚拟仪器网提供翻译好的中文资料)pdf

 

系统分类: 单片机  |  用户分类: AVR  |  标签: TLC2453 驱动 Mega16  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(2123) | 回复(9)

发表于 2008/9/11 20:57:24

7

关于投票

[原创]M16驱动12864液晶(KS0108)

最近做项目要用到一块JCM12864A的液晶,控制器是KS0108的。这块液晶在绘图方面比ST7920的方便多了,但是不带字库,如果显示字符少的话自己做字库也很方便的。

先上张效果图,晚上照的效果不太好凑和着看吧o(∩_∩)o...

点击看大图

因为要显示的西文字符多,我这里用的是5*7的字库,所以显示的比较紧凑;汉字我用的16*16宋体加粗。代码里有显示96个ASCII码和汉字的函数,可以单个或字符串显示。

项目代码(AVRStudio+GCC):http://space.ednchina.com/upload/2008/9/14/8822d5cd-7f84-42e9-b118-241b7c0fcff8.rar

没用过KS0108液晶的可以参考上面的代码,觉的好你就顶一下!icon

系统分类: 单片机  |  用户分类: AVR  |  标签: 12864 KS0108 液晶 驱动  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(3947) | 回复(16)

发表于 2008/9/3 10:42:24

3

关于投票

【原创】Mega16读写SD卡

这是我这几天学习SD卡读写的结果,参考了网络上的一些资料,上电初始化数据后读取容量制造商信息,然后往块2写入512字节数据然后读出,串口显示。硬件是Mega16外部7.37628M晶体SPI方式读写。

点击看大图

点击看大图

项目工程下载:http://space.ednchina.com/upload/2008/9/3/e6dfdcd8-fc9d-48c9-8a65-a9ee9b1438a8.rar

系统分类: 单片机  |  用户分类: AVR  |  标签: SD 驱动 Mega16  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1599) | 回复(7)

发表于 2008/8/18 9:27:57

2

关于投票

[学习]用595驱动LED实现灰度调节

前一段时间在ouravr论坛里闲逛的时候看到一篇关于用595驱动LED现实等级灰度的求助贴,楼主的意思是用595驱动LED,并且每个LED的亮度值可以随意调节,来达到不同的灰度。我感觉挺有意思的,用595驱动LED并不难,整体亮度调节也不难,再用PWM控制所有595OE就可以了,单个LED灰度的调节就比较麻烦了。有一位叫“polarbear 枫叶”回帖提出的思路比较简单新颖,我按照他的思路试验了,感觉效果还不错!硬件是M48+2片595+16个LED,用的硬件ISP主机模式。 

先上图再说:

点击看大图

 

现在来说说实现的方法吧,转载一下枫叶的原话:

16个灰度,也就是 0--15,用4BIT来表示, 8-4-2-1

PWM产生4个联系不同占空比的脉冲

T8        8/16                
对应
BIT8        
T4        4/16                
对应
BIT4        
T2        2/16                
对应
BIT2        
T1        1/16                
对应
BIT1        

8/16
表示的是把PWM的周期划分为16份,其中量的周期占8份,其他雷同


当这4个脉冲运行后,由于人的生理特点。也会出现需他的灰度;

同上面的方法比较,它需要4次个周期人眼才能感觉出灰度;

但是对PWM的要求就很低;比如256种灰度,不过送8次,1024也不过要10

大大减低了对硬件的要求,现在基本都是使用这种方法;


在一个595+出现不同的灰度,就必须结合下面说的东东;

把一个灰度分解成4

例如灰度9
 1001
T8        8/16                
对应
BIT8        
T4        
不亮                对应
BIT4        
T2        
不亮                对应
BIT2        
T1        1/16                
对应
BIT1
所以我们的各个灰度分解为4帧,送4次都595,就可以了

例如在1595上出现下面不同灰度的4个点,(就以4个点举例,)

4
个点的灰度

3,12,10,7
转化为BIN

0011  1100  1010 0111
8-4-2-1分割出来,得到独立的4

BIT8
0      1     1   0
BIT4
0       1     0   1
BIT2
1      0      1   1
BIT1
1      0      0    1

步骤:

1.
BIT8的数据送到595,PWM控制OE的脉冲为
T8
2.
BIT4的数据送到595,PWM控制OE的脉冲为
T4
3.
BIT2的数据送到595,PWM控制OE的脉冲为
T2
4.
BIT1的数据送到595,PWM控制OE的脉冲为
T1


经过4帧的时间叠加后,就得到不同的灰度。

 

原帖地址:http://www.ouravr.com/bbs/bbs_content_all.jsp?bbs_sn=985613

我的程序下载(WINAVR GCC + m48Dev)rar

 

 

系统分类: 单片机  |  用户分类: AVR  |  标签: 灰度 595 LED  |  来源: 整理  | 

点击查看原文

发表评论 阅读全文(1327) | 回复(0)

发表于 2008/7/15 16:32:42

3

关于投票

[原创]Mega48解码PS/2键盘+串口显示

前几天在单位发现了一个古董机级的键盘,估计是以前X86机器上的键盘,虽然出的早但键盘依然很结识,拿起来很有手感(很重金属材料用的不少),连接上电脑居然还能使用,不过遗憾的是有现按键在XP系统下识别不了。仍了怪可惜的,作为研究PS2协议还是很不错的,于是乎就查资料写了个PS/2键盘的小程序,AVR GCC环境下编写,单片机用是AVR的Mega48v,硬件平台还是我的m48Dev 外置7.3728M晶体,PS/2键盘与单片机连接如下:

PS/2_DATA -------------------PC0

PS/2_CLK----------------------INT0

PS/2_VCC----------------------+5V

PS/2_GND----------------------GND

串口接收截图

点击看大图

部分核心代码:

/************************************************************************
*名称: unsigned char PS2_KeyDeCode(unsigned char bKeyCode)     
*功能: PS2键盘解码程序                     
*参数: bKeyCode 键盘码        
*返回: 按键的ASIIC码                                     
************************************************************************/
unsigned char PS2_KeyDeCode(unsigned char bKeyCode)
{
 unsigned char i;
 if (!PS2KeyStatus.bBreakFlag)//通码
 {
  switch (bKeyCode)//开始翻译扫描码
  {
   case 0xF0: //键盘释放随后的一个字节是断码
   {
    PS2KeyStatus.bBreakFlag = 1;//断码标志置位
    break;
   }
   case 0x12:    //左shift键按下
   {
    PS2KeyStatus.bShiftFlag = 1; //shift标志置位
    break;
   }
   case 0x59:    //右shift键按下
   {
    PS2KeyStatus.bShiftFlag = 1; //shift标志置位
    break;
   }   
   default:       
   { 
    PS2KeyStatus.bBreakFlag = FALSE;
    if(!PS2KeyStatus.bShiftFlag) //如果shift键没有按下
    {  
     for(i = 0; i < 65; i++)//查表找按键ASIIC码
     {
      if(pgm_read_byte(PS2CodeUnShift[i]) == bKeyCode)
      {
       PS2KeyStatus.bKeyAsiic =
         pgm_read_byte(PS2CodeUnShift[i] + 1);
       PS2KeyStatus.bKeyNewFlag = TRUE;
       break;
      }
     }
    }
    else  //如果shift键按下
    {       
     for(i=0; i < 65; i++)//查表找按键ASIIC码
     {
      if(pgm_read_byte(PS2CodeShift[i]) == bKeyCode)
      {
       PS2KeyStatus.bKeyAsiic =
         pgm_read_byte(PS2CodeShift[i] + 1);
       PS2KeyStatus.bKeyNewFlag = TRUE;
       break;
      }
     }
    }
    break;
   }
  }
 }
 else //断码
 {
  PS2KeyStatus.bBreakFlag = 0; //将断码标志复位
  switch (bKeyCode)  //检测shift键释放
  {
   case 0x12 :      //左shift键
    PS2KeyStatus.bShiftFlag = 0;
    break;
   case 0x59 :   //右shift键
    PS2KeyStatus.bShiftFlag = 0;
    break;
   default:
    break;
  }
 }

下载完整代码:rar
另附PS/2协议中文版pdf

 

系统分类: 单片机  |  用户分类: AVR  |  标签: PS/2 键盘 Meag48 AVR 串口  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1278) | 回复(2)

发表于 2008/4/28 15:55:50

1

关于投票

[原创]用M48的PWM功能控制风扇转速

   比较基础简单的试验,适合新手入门老鸟就不用看了,呵呵!

   ATMega48的定时器1工作在8位快速PWM模式,产生3906.25Hz的PWM波通过三极管来调整风扇的转速,风扇是CPU散热器上的直流12V风扇。程序是循环重低到高再到低来调整风扇转速。

点击看大图

代码如下:

/*************************************************************************
* Copyright (c) 2007 wormchen            
* All rights reserved             
* 文 件 名: main.c              
* 说    明: PWM 调整风扇转速                
*                            
* 主要硬件: AtemlMega48(内部1M)            
* 编译环境: WinAVR 20070525            
* 当前版本: 1.0               
* 作    者: wormchen               
* 完成日期: 2008年4月22日11:33:19          
* 取代版本: 1.0               
* 原作  者: wormchen              
* 完成日期: 2008年4月22日11:33:23          
************************************************************************/  
#include
#include
#include
unsigned int uchPWM = 0;

/************************************************************************
* 名称: void DelayMS(unsigned int uiMS)           
* 功能: 延时nms                     
* 参数: 无                                   
* 返回: 无                                     
************************************************************************/
void DelayMS(unsigned int uiMS)
 { 
  while(uiMS--)
   {
    _delay_loop_2(250); // 延时1ms(粗略)
   }
 }
/*************************************************************************
* 名称: void PORT_Init(void)              
* 功能: 端口初始化                    
* 参数: 无                                   
* 返回: 无                                     
*************************************************************************/ 
void PORT_Init(void)
 {
  PORTB &=  ~((1 << PB1) | (1 << PB2));
  DDRB = (1 << PB1) | (1 << PB2); 
 } 
/*************************************************************************
* 名称: void Timer1_Init(void)              
* 功能: TIMER1初始化                    
* 参数: 无                                   
* 返回: 无                                     
*************************************************************************/
void Timer1_Init(void)
{
 //快速PWM模式频率3906.25Hz
 TCNT1 = 0x0000;
 OCR1A = 0x0000;
 TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM10);
 //比较匹配清零TOP置位
 TCCR1B = (1 << WGM12) | (1 << CS10);
 //定时器1工作于8位快速PWM模式无分频

int main(void)
 {
  PORT_Init();
  Timer1_Init();
  while(1)
   {
    for(uchPWM = 0 ; uchPWM < 255; uchPWM++)
    {
     OCR1A = uchPWM;
     if(uchPWM == 0)
     {
      DelayMS(2000);
     }
     else
     {
      DelayMS(100);
     }     
    }
    for(uchPWM = 255 ; uchPWM > 0; uchPWM--)
    {
     OCR1A = uchPWM;
     if(uchPWM == 255)
     {
      DelayMS(2000);
     }
     else
     {
      DelayMS(100);
     }
     
    }
   }
 }

 

系统分类: 单片机  |  用户分类: AVR  |  标签: PWM 转速 m48 AVR  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(1459) | 回复(0)

发表于 2008/4/23 10:03:41

3

关于投票

[原创]用L298驱动直流减速电机

   前一段有个朋友让我帮忙做一个电机控制的小东西要求是:控制直流减速的电机的启动、停止和正反转。起初我用4个N沟道IRF540N来做H桥驱动,发现H桥并不能输出12V电压给电机并且上桥避MOS很热,因为以前没有做过H桥后来查资料才知道是MOS管没有完全饱和导通再加上管子压降,所以输出电压不够。要想解决问题就必须提高上臂GS电压,电源是12V,栅极就必须是24V才能使上臂完全饱和导通。这样就必须提高电源,虽然有专用的桥驱动IC IRF2401但是一片几十元价格最后我还是放弃这种方案,选用小功率的直流电机驱动芯片L298,这是一款常用驱动IC,内部有两组H桥,驱动电流2A,40V正好满足我的要求(我的电机是直流12V15W),并且驱动电路简单。

   接下来我用ATTiny13来驱动L298来控制直流减速电机,程序到是很简单,但调试的时候又遇到了麻烦,搭好电路在运行的时候发现单片机有重启的现象,起初以为是电源功率不够电机启动拉低电源电压照成单片机重启,后来更换电源后问题依旧。既然不是电源问题,那就是有干扰信号影响单片机 ,我用示波器来监视单片机跟L298连接控制线并有杂波信号过来,这很让我感到很疑惑。一位同事看后我的电路说:“是不是管子电流不够啊?”我这才发现我的电源桥式整流用的是IN4007,电机消除反相电动势的是4个二极管是1N5819,这些管子电流都是1A,而我的电机电流是1.2A的,因为当时手头有这两种管子于是就随手焊上去了。在更换更大功率的管子1N5408和1N5822后,连续运行两天一切正常,问题的原因在于器件的参数不对。

   通过这次事情对于电机驱动我也总结了几点心得,以后再做这方面电路是值得注意的:

1.电机供电最好和单片机供电独立开来,中间加光耦隔离。防止电机通过回路干扰单片机。如果非要共用一个电源,那也要采取一些措施模拟地和数字地单点共地,采用0欧电阻或磁珠连接;

2.元件件的参数要留一定的富裕量,保证能可靠工作。IC器件VCC加104电容高频滤波;

3.PCB布线强弱电分开,尽量远离走线;

由于单片机程序比较简单就不在贴上来了,下面只放上原理图和实物图片:

点击看大图

点击看大图

点击看大图

系统分类: 单片机  |  用户分类: AVR  |  标签: L298 直流电机  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(6838) | 回复(10)

发表于 2008/4/5 22:54:32

1

关于投票

[原创]AVR并口下载线自制

今天上午我用STK500下载程序的时候发现烧不能烧录程序了,读芯片数据也是时对时错,芯片ID号每读一次都不一样很是奇怪。再确定目标板硬件连接没有问题后,更换STK500晶体后故障依旧。这下我可着急了手头没有别的烧录器了,因为是给一个朋友做的一个小项目催的很急,再买去新的下载器一来一回也要耽误几天。后来想到了并口下载线,这个制作简单不需要单片机只需要很少几个元件就可以制作完成,上位机可以用双龙的SLISP,下午去中州商场买齐元件(很遗憾没有买到配套的壳体),晚上焊接完毕后接目标板测试下载程序正常,又抱着试试的心态重新烧写STK500的固件,我的STK500又奇迹般的好了,o(∩_∩)o...这个并口下载器可给我帮了大忙了,其实对于初学者是个不错的选择,整个下来也就7、8块钱,唯一缺点就是速度不是很快!

参考ouravr网站上的原理图:

点击看大图

我自己作的并口ISP正面图:

点击看大图

背面:

点击看大图

系统分类: 单片机  |  用户分类: AVR  |  标签: 并口下载线 ISP AVR  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(2310) | 回复(1)

发表于 2008/3/14 10:18:43

2

关于投票

[原创]我自己的m48学习板

以前学习AVR的时候都是焊接万能板,由于板子不太好焊几次就废了很是麻烦,最后终于决定自己作一块学习板方便自己平时使用。前天拿到板子,昨天花一上午的时间焊好,由于焊接贴片功夫不到家板子焊的很难看,后来用无水乙醇清洗后还能拿的出手!下午简单测试了一下串口和ISP目前还没什么大问题,:-)

点击看大图

点击看大图

点击看大图

点击看大图

点击看大图

系统分类: 单片机  |  用户分类: AVR  |  标签: 学习板 M48 AVR  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(927) | 回复(3)

发表于 2007/8/23 15:32:53

1

关于投票

[原创]怎样从ST7920里读数据

ST7920是一款带中文字库的点阵液晶图形液晶驱动芯片,市场有很多用此控制器成产液晶模块。我有手头就有一款型号为TS12864的液晶模块,其特点是带中文字库,显示中文汉字比较方便,另外还有3线串行驱动模式可以用于管脚少的场合。
既然是图形液晶我们就会用他的绘图功能,有时候为了不破坏原有图形(在现有图形上叠加),这个时候就需要读出原有图形数据然后加工后再次写入。官方手册上对读数据写的不够详细,在网上搜索也找不到例程,使我坡费了一般周折,还好终于搞定!现在吧详细读数据方法和步骤呈上,希望能对大家有所帮助。

点击看大图

官方文档的读数据描述

点击看大图

官方文档并行读数据时序

下面是AVR M48 8M振荡频率下并行读数据的关键部分代码:

#define ST7920_DB_PORT    PORTD    //ST7920数据输入
#define ST7920_DB_PIN    PIND    //ST7920数据输出 
#define ST7920_DB_PORT_SET_OUT  DDRD = 0xFF;  //设置数据端口为输出
#define ST7920_DB_PORT_SET_IN  DDRD = 0x00;  //设置数据端口为输入
#define ST7920_ReadBF  (PIND&(1 << PIND7))  //读忙碌标志位
#define ST7920_RST_SET   PORTB |= (1 << PB0)  //复位置位
#define ST7920_RST_CLR   PORTB &= ~(1 << PB0)  //复位清零
#define ST7920_E_SET   PORTB |= (1 << PB1)  //读写使能置位
#define ST7920_E_CLR   PORTB &= ~(1 << PB1) //读写使能清零
#define ST7920_RW_SET   PORTB |= (1 << PB2)   //读写置位       
#define ST7920_RW_CLR   PORTB &= ~(1 << PB2)    //读写清零
#define ST7920_RS_SET   PORTB |= (1 << PB3)  //显示/命令置位
#define ST7920_RS_CLR   PORTB &= ~(1 << PB3) //显示/数据清零

************************************************************************
名称: unsigned char ST7920_ReadData(void)                  
功能: 从ST7920读数据                   
参数: 无                                      
返回: uchRevData 读取的一字节数据                
************************************************************************  
*/
unsigned char ST7920_ReadData(void)
 {
  unsigned char uchRevData;
  ST7920_CheckBusy();                     //忙碌检测 
  ST7920_DB_PORT = 0xFF;           //打开上拉电阻
  ST7920_DB_PORT_SET_IN;        //设置为输入 
  ST7920_RS_SET;
  ST7920_RW_SET;
  ST7920_E_SET;
  asm("nop"::);
  asm("nop"::);
  uchRevData =  ST7920_DB_PIN;
  ST7920_E_CLR;
  return uchRevData;
 }
/*
************************************************************************   
名称: unsigned int ST7920_ReadGDRAMData(unsigned char uchX ,
          unsigned char uchY)                   
功能: 从GDRAM指定地址读取两字节数据                                    
参数: uchX水平地址(0-127) uchY垂直地址(0-63)                                                                       
返回: 读取两字节数据                                                
************************************************************************                       
*/
unsigned int ST7920_ReadGDRAMData(unsigned char uchX ,unsigned char uchY)
 {
  unsigned int uiReadData = 0;
  ST7920_GDRAMLocate(uchX, uchY);          //设定GDRAM地址
  ST7920_ReadData();                                     //先预读一次
  uiReadData = ST7920_ReadData();               //读设定地址高字节数据
  uiReadData = uiReadData << 8 | ST7920_ReadData();          //读设定地址低字节数据
  ST7920_WriteCMD(0x36);          
  ST7920_WriteCMD(0x30);
  return uiReadData;  
 } 

注意:在设定好要读的地址后,要先空读一次,然后才能依次读出两个字节的数据。如果还有不明白的地方可以QQ交流。

系统分类: 单片机  |  用户分类: AVR  |  标签: ST7920 读数据 液晶模块  |  来源: 原创  | 

点击查看原文

发表评论 阅读全文(3107) | 回复(8)

2Next >Total , Page /