原创 16*16点阵显示--基于PIC16F877A

2009-6-3 17:01 2127 3 3 分类: MCU/ 嵌入式

        最近自己能支配的时间很多,所以一直想动手学点什么!而自己想学的东西又相当多,所以也很头疼。经过一段时间的考虑以现在的环境再结合经济情况,觉得从单片机开始还是比较经济和现实的。而且单片机系统应该说是一个非常重要且基础的系统。掌握单片机系统对以后学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++;
 }
}



                aa294f1c-506b-4b97-855d-ec03020bba1b.GIF

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
3
关闭 站长推荐上一条 /1 下一条