搜索
bottom↓
回复: 26

学AVR一个礼拜了 献上一个AD转换 12864显示的程序

[复制链接]

出0入0汤圆

发表于 2007-9-16 20:49:12 | 显示全部楼层 |阅读模式
//GCC M8
#include<avr/io.h>
#include<avr/pgmspace.h>
#include<avr/delay.h>
#include<avr/interrupt.h>
#include<avr/signal.h>
#define setbit(sfr,bit) (sfr|=(1<<bit))
#define clrbit(sfr,bit) (sfr&=~(1<<bit))
#define DATA PORTB
#define RW 1
#define DI 5
#define CS1 2
#define CS2 3
#define E 4
#define R PORTC
const unsigned char ling[16]PROGMEM={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00};/*"0",0*/
const unsigned char yi[16]PROGMEM={0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00};
const unsigned char er[16]PROGMEM={0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00};/*"2",0*/
const unsigned char san[16]PROGMEM={0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00};/*"3",0*/
const unsigned char si[16]PROGMEM={0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00};/*"4",0*/
const unsigned char wu[16]PROGMEM={0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00};/*"5",0*/
const unsigned char liu[16]PROGMEM={0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00};/*"6",0*/
const unsigned char qi[16]PROGMEM={0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00};/*"7",0*/
const unsigned char ba[16]PROGMEM={0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00};/*"8",0*/
const unsigned char jiu[16]PROGMEM={0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00};/*"9",0*/
const unsigned char zhuan[32]PROGMEM={
0x08,0xC8,0xB8,0x8F,0xE8,0x88,0x40,0x48,
0xC8,0x7F,0x48,0x48,0x4C,0x68,0x40,0x00,
0x08,0x18,0x08,0x04,0xFF,0x04,0x00,0x02,
0x13,0x22,0x62,0x9A,0x06,0x02,0x00,0x00
};
const unsigned char huan[32]PROGMEM={
0x10,0x10,0x10,0xFF,0x90,0x90,0xE8,0x24,
0x27,0xF4,0x2C,0x24,0xF0,0x20,0x00,0x00,
0x02,0x42,0x81,0x7F,0x84,0x84,0x47,0x24,
0x14,0x0F,0x14,0x24,0x47,0xC4,0x44,0x00
};
const unsigned char jie[32]PROGMEM={
0x00,0x30,0x28,0xA4,0x63,0x10,0x08,0x48,
0x48,0x48,0x7F,0x48,0x48,0x4C,0x08,0x00,
0x00,0x22,0x63,0x22,0x12,0x12,0x00,0xFE,
0x42,0x42,0x42,0x42,0x42,0xFF,0x02,0x00
};
const unsigned char guo[32]PROGMEM={
0x00,0x00,0x00,0xFE,0x92,0x92,0x92,0xFE,
0x92,0x92,0x92,0xFF,0x02,0x00,0x00,0x00,
0x02,0x42,0x42,0x22,0x12,0x0A,0x06,0xFF,
0x06,0x0A,0x12,0x22,0x62,0x23,0x02,0x00
};
const prog_uchar *sr;
volatile unsigned int Result=0;
unsigned char DispBuf[4];
//初始化IO口
void Init_IO(void)
{
        DDRC|=0xfe;
        PORTC=0xff;
        DDRD=0xff;
        PORTD=0xff;
        DDRB=0xff;
        PORTB=0xff;
}
//初始化ADC
void Init_AD(void)
{
        ADMUX|=(1<<REFS1)|(1<<REFS0);
        ADCSRA|=(1<<ADIE);
}
//ADC中断服务程序
SIGNAL(SIG_ADC)
{
        Result=ADCL;
        Result|=(unsigned int)(ADCH<<8);
}
//检查LCD是否空闲
unsigned char getstate(void)
{
    PORTB=0xff;
    DDRB=0x00;
        clrbit(R,CS1);
        clrbit(R,CS2);
    clrbit(R,DI);
        setbit(R,RW);
        setbit(R,E);
        clrbit(R,E);
        return PINB;
}
unsigned char lcdbusy(void)
{
        unsigned char state=0;
        state=getstate();
        if(state&0x80)
                return 1;
        else
            return 0;
}
//写命令
void lcdcommand(unsigned char command)
{
        DDRB=0xff;
        clrbit(R,CS1);
        clrbit(R,CS2);
        clrbit(R,RW);
        clrbit(R,DI);
    DATA=command;
        setbit(R,E);
        clrbit(R,E);
}
//开lcd
void lcdopen(void)
{       
        while(lcdbusy());
        lcdcommand(0x3f);
}
//设置开始行
void lcdsetline(unsigned char line)
{
        line|=0xc0;
        while(lcdbusy());
        lcdcommand(line);
}
//设置开始页
void lcdsetpage(unsigned char page)
{
        page&=0xbf;
        page|=0xb8;
        while(lcdbusy());
        lcdcommand(page);
}
//设置列地址
void lcdsetrow(unsigned char row)
{
        row&=0x7f;
    row|=0x40;
        while(lcdbusy());
        lcdcommand(row);
}
//写数据
void lcdwrite(unsigned char data,unsigned char cs)
{
        while(lcdbusy());
    DDRB=0xff;
        if(cs==1)
        {
                clrbit(R,CS1);
                setbit(R,CS2);
        }
        else
        {
                setbit(R,CS1);
                clrbit(R,CS2);
        }
        clrbit(R,RW);
        setbit(R,DI);
        DATA=(data);
        setbit(R,E);
        clrbit(R,E);
}
//写一个数字
void lcd_nu(unsigned char cs,unsigned char page,unsigned char row,unsigned char line)
{            
        unsigned char i;
        lcdsetline(line);
        lcdsetpage(page);
        lcdsetrow(row);
        for(i=0;i<8;i++)
        {
                lcdwrite(pgm_read_byte(sr++),cs);
        }
        lcdsetline(line);
        lcdsetpage(page+1);
        lcdsetrow(row);
        for(i=8;i<16;i++)
        {
                lcdwrite(pgm_read_byte(sr++),cs);
        }
}
//写一个汉字
void lcd_cn(const prog_uchar *src,unsigned char cs,unsigned char page,unsigned char row,unsigned char line)
{
        unsigned char i;
    lcdsetline(line);
        lcdsetpage(page);
        lcdsetrow(row);
        for(i=0;i<16;i++)
        {
                lcdwrite(pgm_read_byte(src+i),cs);
        }
    lcdsetline(line);
        lcdsetpage(page+1);
        lcdsetrow(row);
    for(i=16;i<32;i++)
        {
                lcdwrite(pgm_read_byte(src+i),cs);
        }
}
//结果装入显示缓冲区及显示服务程序
void Showlcd(void)
{
    unsigned char r;
        DispBuf[3]=Result%10;
        DispBuf[2]=(Result%100)/10;
        DispBuf[1]=(Result/100)%10;
        DispBuf[0]=(Result/1000);
        for(r=0;r<4;r++)
        {
            if(DispBuf[r]==0)
                        sr=ling;
                else if(DispBuf[r]==1)
                        sr=yi;
                else if(DispBuf[r]==2)
                        sr=er;
            else if(DispBuf[r]==3)
                        sr=san;
                else if(DispBuf[r]==4)
                        sr=si;
            else if(DispBuf[r]==5)
                        sr=wu;
                else if(DispBuf[r]==6)
                        sr=liu;
            else if(DispBuf[r]==7)
                        sr=qi;
                else if(DispBuf[r]==8)
                        sr=ba;
            else if(DispBuf[r]==9)
                        sr=jiu;
                else
                        sr=ling;
                lcd_nu(2,3,r*8,0);
        }
}
       
//主程序
int main(void)
{
   
        Init_IO();
        Init_AD();
        lcdopen();
        ADCSRA|=(1<<ADEN);
        sei();
        lcd_cn(zhuan,1,3,0,0);
        lcd_cn(huan,1,3,16,0);
        lcd_cn(jie,1,3,32,0);
        lcd_cn(guo,1,3,48,0);
        while(1)
        {
                ADCSRA|=(1<<ADSC);
                Showlcd();
                _delay_loop_2(10000);
        }
}
头像被屏蔽

出0入0汤圆

发表于 2007-9-16 22:12:55 | 显示全部楼层
谢谢共享。置COOL。

另:

1。最好能有电路图,或用文字描述一下连线。
2。我们网站不允许出现那个仿真软件的字眼,详细请参考: http://www.ouravr.com/bbs/anti-proteus.html

出0入0汤圆

 楼主| 发表于 2007-9-16 22:46:38 | 显示全部楼层
接线说明
PB0-DB0```PB7-DB7
PC1-RW
PC2-CS1
PC3-CS2
PC4-E
PC5-RS
PC0-AD输入口

出0入0汤圆

发表于 2007-12-12 16:46:59 | 显示全部楼层
谢谢!!

出0入0汤圆

发表于 2007-12-12 17:53:45 | 显示全部楼层
牛!!!学一个星期就能做出这么好的东东出来啊
我都接触ATMEGA16半年了,还是一溻糊涂啊,哈哈……
菜鸟!!!

出0入0汤圆

发表于 2007-12-28 17:06:28 | 显示全部楼层
好的,不错

出0入0汤圆

发表于 2008-1-14 20:03:16 | 显示全部楼层
强人阿!我搞了这么久,现在还是一头雾水阿!

出0入0汤圆

发表于 2008-3-31 13:31:06 | 显示全部楼层
学习了

出0入46汤圆

发表于 2008-3-31 17:15:05 | 显示全部楼层
hao!

出0入0汤圆

发表于 2008-4-3 14:20:24 | 显示全部楼层
不错啊,支持

一个礼拜就能搞出这个

我还是在别人的基础上搞的

出0入0汤圆

发表于 2008-4-3 21:48:58 | 显示全部楼层
LZ肯定有比较扎实的基础吧

出0入0汤圆

发表于 2008-4-4 05:53:41 | 显示全部楼层
还行,不错,有时间下载看一下,不过。。。。我没有带左右片选的12864
哈哈

出0入0汤圆

发表于 2009-3-23 10:00:01 | 显示全部楼层
很好

出0入0汤圆

发表于 2009-3-24 13:53:21 | 显示全部楼层
标记

出0入0汤圆

发表于 2009-3-25 11:51:22 | 显示全部楼层
谢谢,楼主的共享精神..支持

出0入0汤圆

发表于 2009-3-27 21:52:30 | 显示全部楼层
谢谢楼主!

出0入0汤圆

发表于 2009-4-29 09:58:50 | 显示全部楼层
顶下,以后学习

出0入0汤圆

发表于 2009-7-2 09:46:37 | 显示全部楼层
dddddddddddddd

出0入0汤圆

发表于 2009-7-3 09:30:57 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2009-7-17 11:20:14 | 显示全部楼层
谢谢楼主共享

出0入0汤圆

发表于 2009-8-1 11:40:58 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-8-6 10:09:22 | 显示全部楼层
学习

出0入0汤圆

发表于 2009-8-6 20:44:57 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-10-17 10:31:42 | 显示全部楼层
用数码管显示后不爽,现在也想用12864尝试下

出0入0汤圆

发表于 2010-10-20 16:43:33 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-20 19:33:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-20 20:03:55 | 显示全部楼层
一个礼拜就这水平了啊。。。俺真是太菜了。。。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-6 09:35

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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