最新日志

发表于:2008-7-3 21:37:42
标签:AVR  ICCAVR  

0

ICCAVR的基本使用图解

ICCAVR的基本使用图解

pdf

点击看大图

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(45)
发表于:2008-7-2 21:15:54
标签:LED  流水灯  Proteus  仿真  

0

LED流水灯仿真

ATMEGA32第一个学习例子:

学单片机得先弄懂它的IO口,所以第一个例子先以控制IO口的输出。最好的方法就是做个LED流水灯。

LED灯的连接定义如下:

led1---PORTD.5,       led2--PORTD.4,     

led3---PORTD.3,       Led4---PORTD.2,      

led5---PORTB.7,       led6---PORTB.6,

Led7---PORTB.5,       led8---PORTB.4,    

led9---PORTB.3,       led10---PORTB.2,   

led11---PORTB.1,      led12---PORTB.0.

程序如下:

//ICC-AVR application builder : 2008-07-02 下午 03:28:23
// Target : M32
// Crystal: 8.0000Mhz

#include
#include
#define  uchar unsigned char 

void port_init(void) //端口定义
{
 PORTA = 0x00;       //低电平
 DDRA  = 0xFF;       //输出
 PORTB = 0x00;       //低电平
 DDRB  = 0xFF;       //输出
 PORTC = 0x00;
 DDRC  = 0x00;
 PORTD = 0x00;
 DDRD  = 0x3C;
}

void init_devices(void)
{
 //stop errant interrupts until set up
 CLI(); //disable all interrupts
 port_init();

 MCUCR = 0x00;
 GICR  = 0x00;
 TIMSK = 0x00; //timer interrupt sources
 SEI(); //re-enable interrupts
 //all peripherals are now initialized
}

//1微秒延时
void delay_1us(void)
{      uchar i="8";
       asm("nop");
        i--;
}
//长微秒延时
void delay_nus(uchar t)
{ while(t--)
  delay_1us();
}
//1毫秒延时
void delay_1ms(void)
{
  delay_nus(1000);
}
//长毫秒延时
void delay_nms(uchar t)
{ while(t--)
  delay_1ms();
}
//定义LED等
void led_out(void)
{  uchar i;
   for(i=1;i<5;i++)
   {PORTD|=BIT(6-i);
   delay_nms(500);}
   for(i=5;i<13;i++)
   {PORTB|=BIT(12-i);
   delay_nms(500);}
   for(i=12;i>4;i--)
   {
    PORTB&=~BIT(12-i);
    delay_nms(500);
 }
 for(i=4;i!=0;i--)
 {
 PORTD&=~BIT(6-i);
 delay_nms(500);
 }
   }
//主程序开始
void main(void)
{
 init_devices();
 while(1)
 {
  led_out();
 }
 //insert your functional code here...
}

仿真包rar

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(218)
发表于:2008-7-2 11:28:30
评论(0) | 阅读(116)
发表于:2008-6-30 11:15:46
标签:无标签

0

AVR时钟周期计算

AVR的RISC系列单片机 单周期指令就是一个时钟周期 1MHz时钟时1us 16MHz时钟时1/16us

我用MGEA8的内部RC震荡时钟,8M
因为MEGA8不会对其进行倍频和分频
所以我认为起时钟周期为1/(8*10^6)=0.125us

请问是这样计算吗?

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 整理

评论(0) | 阅读(66)
发表于:2008-6-29 22:34:06
标签:无标签

0

AVR微秒级与毫秒级精确延时

AVR微秒级与毫秒级精确延时

/*******************************************************************

                             微秒级精确延时(ICC)

*******************************************************************/

include <iom8v.h>
/*======================================
 微秒级精确延时函数,晶振8M:          
 Delay = 0.125 *((tt*4-1)+9)微秒
 其中9包括了调用方的 r16 赋值 1t
 rcall 3t    nop 1t   ret 4t
 brne指令在当判断条件不成立时是单周期
 最后一次判断只有1个周期,补一个nop
 简化计算 = 0.5tt + 1 (us)
======================================*/
void shortdelay(unsigned char tt)
{
        asm("_L2: subi R16,1"); 
        asm(" nop")
        asm(" brne _L2");
        asm(" nop");
        asm(" ret");
}

void main()
{
        shortdelay( 18 );
        while(1)        {
                shortdelay( 48 );
        }
}

 

/************************************************************************

                                        毫秒级精确延时(ICC)

*************************************************************************/

#include<iom8v.h>

#define xtal 8 //以MHz为单位,不同的系统时钟要修改。

void delay_1ms(void)
{
uint i;
for(i=0;i<(unsigned int)(xtal*143-2);i++);
}


void delay_ms(uint num)
{
uint i;
for(i=0;i<num;i++) delay_1ms();
}

void main(void)
{
DDRB=0xff;
PORTB=0x00;

while(1)
{
delay_ms(100);
PORTB^=0xff;
}
}

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(54)
发表于:2008-6-24 17:22:42
标签:avr  

0

AVR单片机IO端口操作方法(ICCAVR)

 

    AVR单片机的IO端口操作是撑握AVR技术的基础,因此需要清晰的理解。下面的例子列出了操作IO端口的方法,资料来源于OURAVR。

举例一:将PB0定义为输出,且输出为高电平

DDRB=BIT(0); //定义 PB0为输出

PORTB|=BIT(0); // PB0 输出高电平

举例二:将PB0PB1定义为输出,PB0PB1均为高电平

DDRB|=BIT(0)|BIT(1); //定义 PB0PB1为输出

PORTB|=BIT(0)|BIT(1);// PB0PB1 输出高电平

举例三:将PB0数据寄存器的数值翻转,即如果是1时变成0,如果是0时变成1

PORTB^=BIT(0); //翻转PB0

举例四:将PB0PB1数据寄存器的数值翻转,即如果是1时变成0,如果是0时变成1

PORTB^=BIT(0)|BIT(1); // 翻转PB0 PB1

举例五:将PB2PB3定义为输入,不带上拉电阻

DDRB&=~(BIT(2)|BIT(3)); //定义 PB2PB3为输入

PORTB&=~(BIT(2)|BIT(3)); // PORT 0,没有上拉电阻

举例六:将PB2PB3定义为输入,带上拉电阻。即没有引用这些引脚时,缺省值为高电平

SFIOR&=~BIT(PUD); // SFIOR寄存器的上拉电阻控制位PUD0,在整个代码中,这句话可以不出现,或仅出现一次即可。因为它是一个控制全部上拉电阻的控制位。

DDRB&=~(BIT(2)|BIT(3)); //定义 PB2PB3为输入

PORTB|=BIT(2)|BIT(3); // PORT 1,满足上拉电阻的另一个条件

举例七:DDRB=BIT(0)|BIT(1) DDRB|=BIT(0)|BIT(1) 的区别

假定在执行上面两句指令前,DDRB 的状态为: 1000 0000

如果执行 DDRB="BIT"(0)|BIT(1) DDRB的状态变为: 0000 0011
如果执行 DDRD|=BIT(0)|BIT(1),,DDRB的状态变为: 1000 0011

那前一句会先清空以前的所有状态,后一句保留前面的状态。

在实际应用中,后一句更常用。

举例八:将第三位置1,除了用BIT(3),还有其它的表达方法吗?

DDRB|=BIT(3);

DDRB|=1<<3;

DDRB|=0x08;

DDRB|=0b00001000;

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(59)
发表于:2008-6-23 18:04:05
标签:无标签

0

关于上拉电阻

(一)上拉电阻:
1、当TTL电路驱动COMS电路时,如果TTL电路输出的高电平低于COMS电路的最低高电平(一般为3.5V),这时就需要在TTL的输出端接上拉电阻,以提高输出高电平的值。
2、OC门电路必须加上拉电阻,才能使用。
3、为加大输出引脚的驱动能力,有的单片机管脚上也常使用上拉电阻。
4、在COMS芯片上,为了防止静电造成损坏,不用的管脚不能悬空,一般接上拉电阻产生降低输入阻抗,提供泄荷通路。
5、芯片的管脚加上拉电阻来提高输出电平,从而提高芯片输入信号的噪声容限增强抗干扰能力。
6、提高总线的抗电磁干扰能力。管脚悬空就比较容易接受外界的电磁干扰。
7、长线传输中电阻不匹配容易引起反射波干扰,加上下拉电阻是电阻匹配,有效的抑制反射波干扰。

(二)上拉电阻阻值的选择原则包括:
1、从节约功耗及芯片的灌电流能力考虑应当足够大;电阻大,电流小。
2、从确保足够的驱动电流考虑应当足够小;电阻小,电流大。
3、对于高速电路,过大的上拉电阻可能边沿变平缓。综合考虑
以上三点,通常在1k到10k之间选取。对下拉电阻也有类似道理 

(三)对上拉电阻和下拉电阻的选择应结合开关管特性和下级电路的输入特性进行设定,主要需要考虑以下几个因素:
1. 驱动能力与功耗的平衡。以上拉电阻为例,一般地说,上拉电阻越小,驱动能力越强,但功耗越大,设计是应注意两者之间的均衡。
2. 下级电路的驱动需求。同样以上拉电阻为例,当输出高电平时,开关管断开,上拉电阻应适当选择以能够向下级电路提供足够的电流。
3. 高低电平的设定。不同电路的高低电平的门槛电平会有不同,电阻应适当设定以确保能输出正确的电平。以上拉电阻为例,当输出低电平时,开关管导通,上拉电阻和开关管导通电阻分压值应确保在零电平门槛之下。
4. 频率特性。以上拉电阻为例,上拉电阻和开关管漏源级之间的电容和下级电路之间的输入电容会形成RC延迟,电阻越大,延迟越大。上拉电阻的设定应考虑电路在这方面的需求。

(四)下拉电阻的设定的原则和上拉电阻是一样的。
OC门输出高电平时是一个高阻态,其上拉电流要由上拉电阻来提供,设输入端每端口不大于100uA,设输出口驱动电流约500uA,标准工作电压是5V,输入口的高低电平门限为0.8V(低于此值为低电平);2V(高电平门限值)。
选上拉电阻时:
500uA x 8.4K= 4.2即选大于8.4K时输出端能下拉至0.8V以下,此为最小阻值,再小就拉不下来了。如果输出口驱动电流较大,则阻值可减小,保证下拉时能低于0.8V即可。
当输出高电平时,忽略管子的漏电流,两输入口需200uA
200uA x15K=3V即上拉电阻压降为3V,输出口可达到2V,此阻值为最大阻值,再大就拉不到2V了。选10K可用。COMS门的可参考74HC系列
设计时管子的漏电流不可忽略,IO口实际电流在不同电平下也是不同的,上述仅仅是原理,一句话概括为:输出高电平时要喂饱后面的输入口,输出低电平不要把输出口喂撑了(否则多余的电流喂给了级联的输入口,高于低电平门限值就不可靠了)

在数字电路中不用的输入脚都要接固定电平,通过1k电阻接高电平或接地。 
1. 电阻作用: 
* 接电组就是为了防止输入端悬空 
* 减弱外部电流对芯片产生的干扰 
* 保护cmos内的保护二极管,一般电流不大于10mA 
* 上拉和下拉、限流 
* 改变电平的电位,常用在TTL-CMOS匹配 

2. 在引脚悬空时有确定的状态 
3.增加高电平输出时的驱动能力。 
4、为OC门提供电流 
* 那要看输出口驱动的是什么器件,如果该器件需要高电压的话,而输出口的输出电压又不够,就需要加上拉电阻。 
* 如果有上拉电阻那它的端口在默认值为高电平你要控制它必须用低电平才能控制如三态门电路三极管的集电极,或二极管正极去控制把上拉电阻的电流拉下来成为低电平。反之, 
* 尤其用在接口电路中,为了得到确定的电平,一般采用这种方法,以保证正确的电路状态,以免发生意外,比如,在电机控制中,逆变桥上下桥臂不能直通,如果它们都用同一个单片机来驱动,必须设置初始状态.防止直通! 

2、定义: 
* 上拉就是将不确定的信号通过一个电阻嵌位在高电平!电阻同时起限流作用!下拉同理! 
* 上拉是对器件注入电流,下拉是输出电流 
* 弱强只是上拉电阻的阻值不同,没有什么严格区分 
* 对于非集电极(或漏极)开路输出型电路(如普通门电路)提升电流和电压的能力是有限的,上拉电阻的功能主要是为集电极开路输出型电路输出电流通道。 

3、为什么要使用拉电阻: 
* 一般作单键触发使用时,如果IC本身没有内接电阻,为了使单键维持在不被触发的状态或是触发后回到原状态,必须在IC外部另接一电阻。 
* 数字电路有三种状态:高电平、低电平、和高阻状态,有些应用场合不希望出现高阻状态,可以通过上拉电阻或下拉电阻的方式使处于稳定状态,具体视设计要求而定! 
* 一般说的是I/O端口,有的可以设置,有的不可以设置,有的是内置,有的是需要外接,I/O端口的输出类似与一个三极管的C,当C接通过一个电阻和电源连接在一起的时候,该电阻成为上C拉电阻,也就是说,如果该端口正常时为高电平,C通过一个电阻和地连接在一起的时候,该电阻称为下拉电阻,使该端口平时为低电平,作用吗: 
比如:当一个接有上拉电阻的端口设为输如状态时,他的常态就为高电平,用于检测低电平的输入。 
* 上拉电阻是用来解决总线驱动能力不足时提供电流的。一般说法是拉电流,下拉电阻是用来吸收电流的,也就是灌电流。
 

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(94)
发表于:2008-6-8 21:10:06
标签:无标签

1

我的PCB设计经验总结

我的PCB设计经验总结
布局:
总体思想:在符合产品电气以及机械结构要求的基础上考虑整体美观,在一个PCB板上,元件的布局要求要均衡,疏密有序。
1
.印制板尺寸必须与加工图纸尺寸相符,符合PCB制造工艺要求,放置MARK点。
2
.元件在二维、三维空间上有无冲突?
3
.元件布局是否疏密有序,排列整齐?是否全部布完?
4
.需经常更换的元件能否方便的更换?插件板插入设备是否方便?
5
.热敏元件与发热元件之间是否有适当的距离?
6
.调整可调元件是否方便?
7
.在需要散热的地方,装了散热器没有?空气流是否通畅?
8
.信号流程是否顺畅且互连最短?
9
.插头、插座等与机械设计是否矛盾?
10
.蜂鸣器远离柱形电感,避免干扰声音失真。
11
.速度较快的器件如SRAM要尽量的离CPU近。
12
.由相同电源供电的器件尽量放在一起。
布线:  
1
.走线要有合理的走向:如输入/输出,交流/直流,强/弱信号,高频/低频,高压/低压等...,它们的走向应该是呈线形的(或分离),不得相互交融。其目的是防止相互干扰。最好的走向是按直线,但一般不易实现,避免环形走线。对于是直流,小信号,低电压PCB设计的要求可以低些。输入端与输出端的边线应避免相邻平行, 以免产生反射干扰。必要时应加地线隔离,两相邻层的布线要互相垂直,平行容易产生寄生耦合。
2
.选择好接地点:一般情况下要求共点地,数字地与模拟地在电源输入电容处相连。
3
.合理布置电源滤波/退耦电容:布置这些电容就应尽量靠近这些元部件,离得太远就没有作用了。在贴片器件的退耦电容最好在布在板子另一面的器件肚子位置,电源和地要先过电容,再进芯片。
4
.线条有讲究:有条件做宽的线决不做细;高压及高频线应园滑,不得有尖锐的倒角,拐弯也不得采用直角,一般采用135度角。地线应尽量宽,最好使用大面积敷铜,这对接地点问题有相当大的改善。 设计中应尽量减少过线孔,减少并行的线条密度。
5
.尽量加宽电源、地线宽度,最好是地线比电源线宽,它们的关系是:地线>电源线>信号线。
6
.数字电路与模拟电路的共地处理,现在有许多PCB不再是单一功能电路(数字或模拟电路),而是由数字电路和模拟电路混合构成的。因此在布线时就需要考虑它们之间互相干扰问题,特别是地线上的噪音干扰。
数字电路的频率高,模拟电路的敏感度强,对信号线来说,高频的信号线尽可能远离敏感的模拟电路器件,对地线来说,整人PCB对外界只有一个结点,所以必须在PCB内部进行处理数、模共地的问题,而在板内部数字地和模拟地实际上是分开的它们之间互不相连,只是在PCB与外界连接的接口处(如插头等)。数字地与模拟地有一点短接。
7
.信号线布在电(地)层上
在多层印制板布线时,由于在信号线层没有布完的线剩下已经不多,再多加层数就会造成浪费也会给生产增加一定的工作量,成本也相应增加了,为解决这个矛盾,可以考虑在电(地)层上进行布线。首先应考虑用电源层,其次才是地层。因为最好是保留地层的完整性。
8
.关键信号的处理,关键信号如时钟线应该进行包地处理,避免产生干扰,同时在晶振器件边做一个焊点使晶振外壳接地。
9
.设计规则检查(DRC
  布线设计完成后,需认真检查布线设计是否符合设计者所制定的规则,同时也需确认所制定的规则是否符合印制板生产工艺的需求,一般检查有如下几个方面:
线与线,线与元件焊盘,线与贯通孔,元件焊盘与贯通孔,贯通孔与贯通孔之间的距离是否合理,是否满足生产要求。
  电源线和地线的宽度是否合适,电源与地线之间是否紧耦合(低的波阻抗)?在PCB中是否还有能让地线加宽的地方。
  对于关键的信号线是否采取了最佳措施,如长度最短,加保护线,输入线及输出线被明显地分开。
  模拟电路和数字电路部分,是否有各自独立的地线。
  后加在PCB中的图形(如图标、注标)是否会造成信号短路。
  对一些不理想的线形进行修改。
PCB上是否加有工艺线?阻焊是否符合生产工艺的要求,阻焊尺寸是否合适,字符标志是否压在器件焊盘上,以免影响电装质量。
  多层板中的电源地层的外框边缘是否缩小,如电源地层的铜箔露出板外容易造成短路。
10
.关于EMC方面:
a
.尽可能选用信号斜率较慢的器件,以降低信号所产生的高频成分。
b
.注意高频器件摆放的位置,不要太靠近对外的连接器。
c
.注意高速信号的阻抗匹配,走线层及其回流电流路径,以减少高频的反射与辐射。
d.
在各器件的电源管脚放置足够与适当的去耦合电容以缓和电源层和地层上的噪声。特别注意电容的频率响应与温度的特性是否符合设计所需。
e
电源层比地层内缩20HH为电源层与地层之间的距离。
11
GERBER输出检查
检查输出的GERBER文件是否按层叠顺序要求输出,在CAM350里查看每一层数据以及DRILL表,同时注意特殊孔如方孔的输出。

点击此处查看原文 >>

系统分类: PCB   |    用户分类: 无分类    |    来源: 无分类

评论(0) | 阅读(245)
发表于:2008-5-9 21:12:16
标签:无标签

0

AVR 与 12864 做的时钟

代码:
20:03 2008-5-9#include <avr/io.h>
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>


#define uchar unsigned char
#define uint unsigned int
#define xtal 8
#define CS  PA5
#define SID  PA6
#define SCLK PA7

#define Set_CS() DDRA |= (1<<CS);PORTA |= (1<<CS)
#define Set_SID() DDRA |= (1<<SID);PORTA |= (1<<SID)
#define Set_SCLK() DDRA |= (1<<SCLK);PORTA |= (1<<SCLK)

#define Clr_CS() DDRA |= (1<<CS);PORTA &=~(1<<CS)
#define Clr_SID() DDRA |= (1<<SID);PORTA &=~(1<<SID)
#define Clr_SCLK() DDRA |= (1<<SCLK);PORTA &=~(1<<SCLK)

#define  HH  2     //定义  时  为2
#define  MM  1     //定义  分  为1
#define  SS  0     //定义  秒  为0

volatile unsigned char Time_h_m_s[3]={0,0,0};   //时间的 时  分  秒  存贮单元
volatile unsigned char flash_sign=0x00;
//====================================================================
//函数声明
void Delay(uint ms);      //延时子程序
void Serial_W_1byte_to_LCD(uchar RS, uchar W_data);
void Serial_send_cmd(uchar send_cmd);
void Serial_send_data(uchar send_data);
void Write_8bits(uchar W_bits);
void LCD_Init(void);
void Serial_send_string_to_xy(uchar row, uchar col, uchar *p);
void Display_clock1(uchar row, uchar col, uchar *time);

/*=============================================================
功能: TIMER2溢出中断函数
=================================================================*/

SIGNAL(SIG_OUTPUT_COMPARE2)     // _VECTOR(3) 
{  
  static unsigned char half_second; 
  if((++half_second)>=2)
   { 
     if((++Time_h_m_s[SS])>=60)
      {
           Time_h_m_s[SS] = 0;
           if((++Time_h_m_s[MM])>=60)
            {
          Time_h_m_s[MM] = 0;
          if((++Time_h_m_s[HH])>=24)
            Time_h_m_s[HH] = 0;
            }        
      }
         half_second = 0x00;     
    }        
  flash_sign &= 0x01;    
  flash_sign ^= 0x01;            //置位闪动标志位(该位为0时闪动)



 /*******************************************************************
函 数 名:Port_init
入口参数:无
出口参数:无
建立日期:2008年05月09日
修改日期:
函数作用:MCU端口初始化函数
说    明:
********************************************************************/
 void Port_init(void)
 {
    DDRC = ~(1<<DDC6);
    PORTC = 0x00;        
    
   ASSR |= (1<<AS2);             //允许Timer2用TOSC1脚的时钟信号
   TIMSK |= (1<<OCIE2);             //允许定时器2比较匹配中断允许
   TCCR2 |= (1<<WGM21)|(1<<CS22)|(1<<CS21);  //CTC模式 ,256分频
   OCR2 = 63;
 }
/*******************************************************************
函 数 名:Serial_send_string
入口参数: *p_send_data
出口参数:无
建立日期:2008年05月09日
修改日期:
函数作用:发送字符串子函数
说    明:
********************************************************************/
void Serial_send_string(uchar *p_send_data)
{
  uchar *p_temp;
  p_temp = p_send_data;
  while(*p_temp != 0)
    {
          Serial_send_data(*p_temp++);
        }
}

//===================================================================*/
/********************************************************************
函 数 名:Serial_send_string_to_xy
入口参数:row,col,*p
出口参数:无
建立日期:2008年04月13日
修改日期:
函数作用:
说    明:
********************************************************************/
void Serial_send_string_to_xy(uchar row, uchar col, uchar *p) 

   switch(row)
    {
          case 0:Serial_send_cmd(0x80+col);
                  break;
          case 1:Serial_send_cmd(0x90+col);
                  break;
          case 2:Serial_send_cmd(0x88+col);
                  break;
          case 3:Serial_send_cmd(0x98+col);
                  break;
          default: break;
    } 
 while(*p != 0)
 {
  Serial_send_data(*p++); //写数据到RAM
 }
}

/********************************************************************/
int main(void)
{
 PORTA = 0XFF;   //
 DDRA = 0XFF;   //PA口全部设为输出模式
 Port_init();
 Clr_CS();
 Clr_SID();
 Clr_SCLK(); 
 LCD_Init();
 Delay(10);
 LCD_Init();     //初始化两边是关键,否则液晶上电重起将不能显示
 sei();  //开总中断 
 while(1)
 { 
  asm("nop");
  asm("nop");  
  Serial_send_cmd(0x30);  //基本指令集,,绘图显示OFF
  //Serial_send_cmd(0x01);  //清除显示    
  Serial_send_string_to_xy(0, 0, "现在时间:");
  Display_clock1(1, 3,Time_h_m_s);
 }
    
}
/*******************************************************************
函 数 名:LCD_Init
入口参数:无
出口参数:无
建立日期:2008年05月09日
修改日期:
函数作用:12864液晶初始化函数
说    明:
********************************************************************/
void LCD_Init(void)
{
  uchar cmd;
 Delay(50); 
  cmd=0x30;   //功能设置 8位数据,基本指令
 Serial_send_cmd(cmd);
 Delay(20);
 cmd=0x0C;   //显示状态 ON,游标OFF,反白OFF
 Serial_send_cmd(cmd); //写指令
 Delay(20);
 cmd=0x01;   //清除显示
 Serial_send_cmd(cmd); //写指令
 Delay(20);
 cmd=0x02;   //地址归位
 Serial_send_cmd(cmd); //写指令
 Delay(20);
 cmd=0x80;   //设置DDRAM地址
 Serial_send_cmd(cmd); //写指令
 Delay(20);   //延时
}
/*******************************************************************
函 数 名:Serial_send_cmd
入口参数:cmd
出口参数:无
建立日期:2008年4月13日
修改日期:
函数作用:写一个字节指令的到12864液晶,
说    明:
********************************************************************/
void Serial_send_cmd(uchar send_cmd)
{
  Serial_W_1byte_to_LCD(0, send_cmd);
}
/*******************************************************************
函 数 名:Serial_send_data
入口参数:cmd
出口参数:无
建立日期:2008年4月13日
修改日期:
函数作用:写一个字节数据到12864液晶,
说    明:
********************************************************************/
void Serial_send_data(uchar send_data)
{
  Serial_W_1byte_to_LCD(1, send_data);
}



/*******************************************************************
函 数 名:Serial_Serial_W_1byte_to_LCD_to_LCD
入口参数:RW、RS、W_data
出口参数:无
建立日期:2007年3月3日
修改日期:
函数作用:写一个字节的数据到12864液晶,包括指令和数据
说    明:RW=1,从液晶读数据到MCU;RW=0,写一个数据到液晶;
   (一般RW都设为0,即只向液晶写数据,不读数据)
          RS=1,写入的是数据;RS=0,写入的是指令;
    一般模式:RW=0,RS=1;写数据
       RW=0,RS=0;写指令
********************************************************************/
void Serial_W_1byte_to_LCD(uchar RS, uchar W_data)
{
 uchar H_data,L_data,S_ID = 0xf8;  //11111 RWRS 0
 
 if(RS == 0)
  {
    S_ID &= ~0x02;
  }
 else     //if(RS==1)
  {
    S_ID |= 0X02;
  }
 H_data = W_data;
 H_data &= 0xf0;   //屏蔽低4位的数据
 L_data = W_data;  //xxxx0000格式
 L_data <<= 4;     //xxxx0000格式
 L_data &= 0xf0;   //屏蔽高4位的数据
    
 Set_CS();
 asm("nop");
 asm("nop");
 Write_8bits(S_ID);   //发送S_ID
 asm("nop");
 Write_8bits(H_data); //发送H_data
 asm("nop");
 Write_8bits(L_data); //发送L_data
 asm("nop");
 Clr_CS(); 
}
/********************************************************************
函 数 名:Write_8bits
入口参数:W_bits
出口参数:无
建立日期:2007年3月3日
修改日期:
函数作用:负责串行输出8个bit位
说    明:
********************************************************************/
void Write_8bits(uchar W_bits)
{
 uchar i,Temp_data;
 Temp_data = W_bits;
 for(i=0; i<8; i++)
 {  
   if((Temp_data&0x80)==0)
    {
      Clr_SID();
    }
   else
    {
     Set_SID();
    } 
   asm("nop");
   asm("nop");   
   Set_SCLK();
   asm("nop");
   asm("nop");   
   Clr_SCLK();
   asm("nop");
   asm("nop");  
   Temp_data <<= 1;  
 }
 Clr_SID();
}
/********************************************************************
函 数 名:Delay
入口参数:ms
出口参数:无
建立日期:2007年3月3日
修改日期:
函数作用:毫秒级的延时程序,当晶振为12Mhz时,xtal=12;
说    明:
********************************************************************/
void Delay(uint ms) 

    uint i; 
    while(ms--)    
   { 
     for(i=1;i<(uint)(xtal*143-2);i++) 
         ; 
   }   
}

/********************************************************************
函 数 名:Display_clock1
入口参数:row,col,*time
出口参数:无
建立日期:2008年05月09日
修改日期:
函数作用:
说    明:
********************************************************************/
void Display_clock1(uchar row, uchar col, uchar *time) 

  unsigned char  c_data[16];
  switch(row)
    {
          case 0:Serial_send_cmd(0x80+col);
                  break;
          case 1:Serial_send_cmd(0x90+col);
                  break;
          case 2:Serial_send_cmd(0x88+col);
                  break;
          case 3:Serial_send_cmd(0x98+col);
                  break;
          default: break;
    }
        
    utoa(time[HH]/10,c_data,10);
    Serial_send_string(c_data);
        utoa(time[HH]%10,c_data,10);
    Serial_send_string(c_data);
        
        if(flash_sign==0x00)
         Serial_send_string(":");
        else
     Serial_send_string(" ");    
        
        utoa(time[MM]/10,c_data,10);
    Serial_send_string(c_data);
        utoa(time[MM]%10,c_data,10);
    Serial_send_string(c_data);
        
        if(flash_sign==0x00)
         Serial_send_string(":");
        else
     Serial_send_string(" ");  
        
        utoa(time[SS]/10,c_data,10);
    Serial_send_string(c_data);
        utoa(time[SS]%10,c_data,10);
    Serial_send_string(c_data);
}

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 无分类

评论(0) | 阅读(160)
发表于:2008-5-9 21:03:37
标签:无标签

0

电子类相关网站

 

http://www.cyfronika.com.pl/BDM/willem.html
http://www.cyfronika.com.pl                                             
国外好网站
http://www.william.com.cn/atmel/index.asp#                              ATMEL
中文推广
http://dzxx.cn-dz.com 
http://dzxx.mlyhs.com
http://bes.8u8.com/pcb/k.htm                                 
热转印制板的详细过程                              
http://www.teachersong.com/index1.htm                         
宋容个人教学单片机
http://www.etuni.com/index.asp                               
下载,论坛,特好!
http://www.pcbtech.net/                                       
中国PCB技术网
http://allgames.gamesh.com/emu/host/ediy/dpj/mcuy10a.htm
http://sdkh.51.net/dz/atm89.htm