最近自己能支配的时间很多,所以一直想动手学点什么!而自己想学的东西又相当多,所以也很头疼。经过一段时间的考虑以现在的环境再结合经济情况,觉得从单片机开始还是比较经济和现实的。而且单片机系统应该说是一个非常重要且基础的系统。掌握单片机系统对以后学FPGA,DSP以及ARM等嵌入式系统都是一个很好的基础。
以前虽然也接触过单品机,但感觉都是一些皮毛的东西,所以希望能利用点时间把单片机弄懂弄通。同时以前做一直都是用汇编,而感觉C将会是一种趋势,而且以后做DSP或ARM也都会用到C,Verilog和C也很像。所以在学习单片机的同时把C开发的一些概念和思想也加强一下。
因为现在所在的地方很难弄得51单片机,所以就决定直接从PIC开始。不过就刚入门的情况来看,PIC和51的区别并不大,只不过它可的功能更丰富,可选择性更大。
因为自己只能算是一个初学者,还在入门阶段,所以只是自己编一些小程序,然后用Proteus进行仿真。
最近一直在做16*16的点阵显示,静态显示很快就能出来了,可是左移的程序调了好几天也没能出来,只要原因就是自己一直不能理解左移的思想,不过最近看一位高手的分析才感觉豁然开朗,终于把程序搞出来了,而且仿真成功!!!
注:行选(PORTB和PORTC),列选用74HC154
程序如下:
#include<pic.h>
#define uchar unsigned char
#define uint unsigned int
#define size_hz sizeof(hz)/32 //取汉字个数;
#define size_zf sizeof(zf)/32 //取字符个数;
__CONFIG(0x3b31);
const uchar hz[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x20,0x04,0x20,0x04,0x22,0x42,0x22,0x82,
0xFE,0x7F,0x21,0x01,0x21,0x01,0x20,0x10,
0x20,0x10,0xFF,0x08,0x20,0x07,0x22,0x1A,
0xAC,0x21,0x20,0x40,0x20,0xF0,0x00,0x00,/*"我",3*/
0x00,0x40,0x40,0x20,0xB2,0xA0,0x96,0x90,
0x9A,0x4C,0x92,0x47,0xF6,0x2A,0x9A,0x2A,
0x93,0x12,0x91,0x1A,0x99,0x26,0x97,0x22,
0x91,0x40,0x90,0xC0,0x30,0x40,0x00,0x00,/*"爱",4*/
0x80,0x00,0x40,0x00,0xF0,0x7F,0x2C,0x00,
0x43,0x10,0x20,0x0C,0x98,0x03,0x0F,0x21,
0x0A,0x40,0xE8,0x3F,0x08,0x00,0x88,0x00,
0x28,0x03,0x1C,0x1C,0x08,0x08,0x00,0x00,/*"你",5*/
0x00,0x00,0x00,0x00,0x70,0x00,0x88,0x01,
0x08,0x02,0x08,0x04,0x10,0x08,0x20,0x10,
0x10,0x08,0x08,0x04,0x08,0x02,0x88,0x01,
0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//*"未命名文件",0*/
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x5F,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00/*"!",6*/
};
const uchar zf[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x80,0x20,0x80,0x20,0xF0,0x3F,
0x88,0x20,0x88,0x20,0x88,0x00,0x18,0x00,/*"f",7*/
0x00,0x00,0x00,0x1F,0x80,0x20,0x80,0x20,
0x80,0x20,0x80,0x20,0x00,0x1F,0x00,0x00,/*"o",8*/
0x80,0x20,0x80,0x20,0x80,0x3F,0x00,0x21,
0x80,0x20,0x80,0x00,0x80,0x01,0x00,0x00,/*"r",9*/
0x00,0x00,0x00,0x1F,0x80,0x22,0x80,0x22,
0x80,0x22,0x80,0x22,0x00,0x13,0x00,0x00,/*"e",10*/
0x80,0x00,0x80,0x01,0x80,0x0E,0x00,0x30,
0x00,0x08,0x80,0x06,0x80,0x01,0x80,0x00,/*"v",11*/
0x00,0x00,0x00,0x1F,0x80,0x22,0x80,0x22,
0x80,0x22,0x80,0x22,0x00,0x13,0x00,0x00,/*"e",12*/
0x80,0x20,0x80,0x20,0x80,0x3F,0x00,0x21,
0x80,0x20,0x80,0x00,0x80,0x01,0x00,0x00,/*"r",13*/
0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x5F,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"!",14*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
void delay(uint x);
void init();
void disphz(uchar Time);
void dispzf(uchar Time);
void main() //主函数
{
init();
while(1)
{
disphz(5);
dispzf(5);
}
}
void delay(uint x) //延时函数,延时1ms
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void init() //初始化函数
{
TRISB=0x00;
TRISC=0x00;
TRISD=0x00;
}
void disphz(uchar Time) //移动显示程序
{
uint i,j,S,word,yidong,code;
code=(size_hz-1)*32;
for(word=0;word<code;word++)
{
for(j=0;j<Time;j++)
{
yidong=word+32;
for(i=word;i<yidong;i++)
{
PORTD=S;
S++;
PORTB=hz;
i++;
PORTC=hz;
delay(1);
}
}
word++;
}
}
void dispzf(uchar Time)
{
uint i,j,S,word,yidong,code;
code=size_zf*32;
for(word=0;word<128;word++)
{
for(j=0;j<Time;j++)
{
yidong=word+32;
for(i=word;i<yidong;i++)
{
PORTD=S;
S++;
PORTB=zf;
i++;
PORTC=zf;
delay(1);
}
}
word++;
}
}
文章评论(0条评论)
登录后参与讨论