中级会员
- 积分
- 400
- 威望
- 205
- 贡献
- 133
- 兑换币
- 132
- 注册时间
- 2013-5-10
- 在线时间
- 31 小时
- 毕业学校
- 鲁南大学
|
2贡献
用脉冲累加器和编码器测速(用的PIT中断),但加上Nokia5110之后 PACNT的值一直为0,不知为什么,不加显示一切正常。请教大神!
不加显示程序,一切正常;加上显示程序下载进去运行后示波器也没波形了
下面是程序
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include "Nokia5110ForXS128.h"
#define uint unsigned int
#define uchar unsigned char
//unsigned char CarCount = 0;
int count_L=0;
void main(void)
{
// uint Dis;
// uint Ds;
// PIT_Init_Flag=0;
DisableInterrupts;
;
PLL_Init();
PORT_Init();
LCD_Init(); //初始化
PACNT_init();
EnableInterrupts;
/*
LCD_Write_String(0,0,"距离noin)mm");
LCD_Write_String(0,2,"Motorspeed:");
LCD_Write_String(0,4,"Smart Car12345");
*/
for(;;)
{
/*
if(PIT_Init_Flag)
{
Dis=count_L/100;
LCD_Write_Num(20,3,Dis,4);
Ds=count_L;
LCD_Write_Num(0,5,Ds,5);
PIT_Init_Flag=0;
} */
}
}
#pragma CODE_SEG __NEAR_SEG NON_BANKED
void interrupt 66 PIT_ISR()
{
PITTF_PTF0=1; // 清中断
// if(CarCount==0)
{
/*----------------*左轮测速*----------------*/
count_L=PACNTL;
PACNT=0x0000;
// PIT_Init_Flag=1;
}
// CarCount++;
// if(CarCount==5)
// CarCount = 0;
}
#pragma CODE_SEG DEFAULT
子程序"Nokia5110ForXS128.h"
#ifndef _Nokia5110_H
#define _Nokia5110_H
#include <hidef.h> /* common defines and macros */
#include "derivative.h" /* derivative-specific definitions */
#include "WordLib.h"
//宏定义
#define LCD_RST PORTA_PA0
#define LCD_CE PORTA_PA1
#define LCD_DC PORTA_PA2
#define SDIN PORTA_PA3
#define SCLK PORTA_PA4
//函数声明
void PLL_Init(void);
void PORT_Init(void);
void Delay_ms(uint);
void Delay_us(uint);
void PIT_Init(void);
//void Pulse_accumulator_Init(void);
void PACNT_init();
void LCD_Init(void);
void LCD_clear(void);
void LCD_write_byte(uchar, uchar);
void LCD_set_XY(uchar , uchar );
void LCD_write_char(uchar );
void LCD_Write_Char(uchar ,uchar ,uchar);
void LCD_Write_Num(uchar ,uchar ,uint,uchar);
void LCD_write_english_string(uchar ,uchar ,char *);
void LCD_write_chinese(uchar , uchar , char *);
void LCD_write_chinese_string(uchar , uchar ,char *);
void LCD_Write_String(uchar , uchar ,char *);
void LCD_draw_bmp_pixel(uchar ,uchar ,uchar *, uchar ,uchar );
//*********时钟初始化******//
void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1)
{ //锁相环时钟=2×16×(3+1)/(1+1)=64MHz
CLKSEL=0;
PLLCTL_PLLON=1;
REFDV=0x81; //REFDV=1//BUS CLOCK=32MHz
SYNR=0x43; //SYNDIV=3
_asm(nop);
_asm(nop);
while(CRGFLG_LOCK!=1)
// POSTDIV=0;
CLKSEL_PLLSEL=1; //选定锁相环时钟
}
//*********IO口初始化******//
void PORT_init(void)
{
DDRA=0xff; //A口输出 Nokia5110
// DDRT=0X80;
// DDRB=0XFF;
}
/******延时ms******/
void Delay_ms(uint mt) //BusClock=32MHz
{
uint mx,my;
for(mx=7800;mx>0;mx--)
for(my=mt;my>0;my--);
}
/******延时us******/
void Delay_us(uint ut) //BusClock=32MHz
{
uint ux,uy;
for(ux=0;ux<=8;ux++)
for(uy=ut;uy>0;uy--);
}
/*----------------*脉冲累加器初始化*----------------*/
void PACN_Init()
{
PACTL=0x50;
PACNT=0;
}
/*---------------------*定时器初始化*---------------------*/
void PIT_Init()
{
PITCFLMT=0x00; // 禁止PIT模块
// PITTF_PTF0=1; // 清中断标志
PITCE_PCE0=1; // 使能定时器通道0
PITMUX=0x00; // 设置定时器通道0使用8位微定时器0
PITMTLD0=250-1; // 设置8位微定时器初值
PITLD0=320-1; // 设置16位定时器初值
// 定时周期=(PITMTLD0+1)(PITLD+1)/Fbus=1ms
PITINTE=0x01; // 开定时器通道0中断
PITCFLMT=0x80; // 使能PIT模块
}
/**********************************************************************
* 函数名称:LCD_Init()
* 函数功能:初始化nokia5110
* 入口参数:无
* 出口参数:无
* 修改人 :BDC
* 修改时间:2011/08/04
**********************************************************************/
void LCD_Init(void)
{
LCD_RST = 0; // 产生一个让LCD复位的低电平脉冲
Delay_us(1);
LCD_RST = 1;
LCD_CE = 0;// 关闭LCD
Delay_us(1);
LCD_CE = 1;// 使能LCD
Delay_us(1);
LCD_write_byte(0x21, 0); // 使用扩展命令设置LCD模式
LCD_write_byte(0xc8, 0); // 设置偏置电压
LCD_write_byte(0x06, 0); // 温度校正
LCD_write_byte(0x13, 0); // 1:48
LCD_write_byte(0x20, 0); // 使用基本命令
LCD_clear(); // 清屏
LCD_write_byte(0x0c, 0); // 设定显示模式,正常显示
LCD_CE = 0; // 关闭LCD
}
/**********************************************************************
* 函数名称:LCD_clear()
* 函数功能:液晶清屏
* 入口参数:无
* 出口参数:无
* 修改人 :BDC
* 修改时间:2011/08/04
**********************************************************************/
void LCD_clear(void)
{
uint i;
LCD_write_byte(0x0c, 0);
LCD_write_byte(0x80, 0);
for (i=0; i<504; i++)
LCD_write_byte(0, 1);
}
/**********************************************************************
* 函数名称:LCD_write_byte()
* 函数功能:写一个字节
* 入口参数:data,要写入的字节;command:0为命令,1为数据
* 出口参数:无
* 修改人 :BDC
* 修改时间:2011/08/04
***********************************************************************/
void LCD_write_byte(uchar data, uchar command)
{
uchar i;
LCD_CE = 0;
if (command == 0)
LCD_DC = 0;
else
LCD_DC = 1;
for(i=0;i<8;i++)
{
if(data&0x80)
SDIN = 1;
else
SDIN = 0;
SCLK = 0;
data= data<< 1;
SCLK = 1;
}
LCD_CE = 1;
}
/**********************************************************************
* 函数名称:LCD_set_XY()
* 函数功能:光标定位x行y列
* 入口参数:X,Y x行y列
* 出口参数:无
* 修改人 :BDC
* 修改时间:2011/08/04
**********************************************************************/
void LCD_set_XY(uchar X, uchar Y)
{
LCD_write_byte(0x40 | Y, 0); // column
LCD_write_byte(0x80 | X, 0); // row
}
/***********************************************************************
* 函数名称:LCD_write_char()
* 函数功能:写入1个字符
* 入口参数:c 要写入的数据
* 出口参数:无
* 修改人 :BDC
* 修改时间:2011/08/04
**********************************************************************/
void LCD_write_char(uchar c)
{
uchar line;
c -= 32;
for (line=0; line<6; line++)
LCD_write_byte(font6x8[c][line], 1);//从ACSII码表中读取字节,然后写入液晶
}
/***********************************************************************
* 函数名称:LCD_Write_Char()
* 函数功能:写入1个字符
* 入口参数:X:行;Y:列;asc:要写入的数据
* 出口参数:无
* 修改人 :BDC
* 修改时间:2011/08/04
**********************************************************************/
void LCD_Write_Char(uchar X,uchar Y,uchar asc)
{
uchar line;
LCD_set_XY(X,Y);//光标定位
// if((asc>=0)&&(asc<=9))
// asc = asc+16;
// else
asc = asc-32;
for (line=0; line<6; line++)
LCD_write_byte(font6x8[asc][line], 1);//从ACSII码表中读取字节,然后写入液晶
}
/***********************************************************************
* 函数名称:LCD_Write_Num()
* 函数功能:显示变亮
* 入口参数:X:行;Y:列;num:变量;N:要显示的变量的位数
* 出口参数:无
* 修改人 :BDC
* 修改时间:2011/08/04
**********************************************************************/
void LCD_Write_Num(uchar X,uchar Y,uint num,uchar N)
{
uchar line;
uchar i=0;
uint n[5]={0};
n[0]= num%10;
n[1]=(num/10)%10;
n[2]=(num/100)%10;
n[3]=(num/1000)%10;
n[4]=(num/10000)%10;
for(i=0;i<5;i++) n[i]=n[i]+16;
for(i=N;i>0;i--)
{
LCD_set_XY(X+(N-i)*6,Y);//光标定位
for (line=0; line<6; line++)
LCD_write_byte(font6x8[n[i-1]][line], 1);//从ACSII码表中读取字节,然后写入液晶
}
}
/***********************************************************************
* 函数名称?LCD_write_english_string()
* 函数功能:写英文字符串
* 入口参数:X,Y,*S------x行y列*s为英文字符串
* 出口参数:无
* 修改人 :BDC
* 修改时间:2011/08/04
***********************************************************************/
void LCD_write_english_string(uchar X,uchar Y,char *s)
{
LCD_set_XY(X,Y);//光标定位
while (*s)
{
LCD_write_char(*s);
s++;
}
}
/**********************************************************************
* 函数名称:LCD_write_chinesee()
* 函数功能:写一个汉字
* 入口参数:x,横坐标;y,纵坐标;hz,要显示的汉字
* 出口参数:无
* 修改人 :BDC
* 修改时间:2011/08/04
**********************************************************************/
void LCD_write_chinese(uchar x, uchar y, char *hz)
{
uchar k,i;
for(k=0;k<sizeof(GB_12)/sizeof(GB_12[0]);k++)//查找汉字编码表中的汉字
{
if((hz[0]==GB_12[k].Index[0])&&(hz[1]==GB_12[k].Index[1]))
break;
}
LCD_set_XY(x,y); //光标定位
for(i=0;i<12;i++)//先写上半字节
LCD_write_byte(GB_12[k].Msk[i],1);
LCD_set_XY(x,y+1);//光标定位下一行
for(i=12;i<24;i++)//后写下半字节
LCD_write_byte(GB_12[k].Msk[i],1);
}
/***********************************************************************
* 函数名称: LCD_write_chinese_sring()
* 函数功能:写汉字串
* 入口参数:x,横坐标;y,纵坐标;string,要显示的汉字串
* 出口参数:无
* 修改人 :BDC
* 修改时间:2011/08/04
***********************************************************************/
void LCD_write_chinese_string(uchar x, uchar y,char *string)
{
uchar i=0,j=0,k=0;
while(string[i])
{
LCD_write_chinese(x,y,&string[i]);
x=x+12;
i=i+2;
}
}
/***********************************************************************
* 函数名称: LCD_Write_String()
* 函数功能:写字符串(中英文)
* 入口参数:x,横坐标;y,纵坐标;String,要显示的字符串
* 出口参数:无
* 修改人 :BDC
* 修改时间:2011/08/04
***********************************************************************/
void LCD_Write_String(uchar x, uchar y,char *string)
{
uchar i=0,j=0,k=0,xh=0,yh=0;
uchar kk,ii;
char *cc,hz[2]={0};
xh=x,yh=y;
while(string[i])
{
for(kk=0;kk<sizeof(GB_12)/sizeof(GB_12[0]);kk++)//查找汉字编码表中的汉字
{
if((string[i]==GB_12[kk].Index[0])&&(string[i+1]==GB_12[kk].Index[1]))
{
LCD_set_XY(xh+i*6,yh); //光标定位
for(ii=0;ii<12;ii++)//先写上半字节
LCD_write_byte(GB_12[kk].Msk[ii],1);
LCD_set_XY(xh+i*6,yh+1);//光标定位下一行
for(ii=12;ii<24;ii++)//后写下半字节
LCD_write_byte(GB_12[kk].Msk[ii],1);
i=i+2;
}
else if((string[i]>=32)&&(string[i]<=121))
{
cc=&string[i];
LCD_set_XY(x+i*6,y);
LCD_write_char(*cc);
i=i+1;
}
}
}
}
/***********************************************************
*函数名称:LCD_draw_bmp_pixel
*函数功能:位图绘制函数
*入口参数:X、Y :位图绘制的起始X、Y坐标;
*map :位图点阵数据;
Pix_x :位图像素(长)
Pix_y :位图像素(宽)
*出口参数:无
*修改人 :BDC
*修改时间:2011/08/04
*备 注:
***********************************************************/
void LCD_draw_bmp_pixel(uchar X,uchar Y,uchar *map, uchar Pix_x,uchar Pix_y)
{
uint i,n;
uchar row;
//计算位图所占行数
if (Pix_y%8==0) //如果为位图所占行数为整数
row=Pix_y/8;
else
row=Pix_y/8+1; //如果为位图所占行数不是整数
LCD_set_XY(X,Y);
for (n=0;n<row;n++) //换行
{
for(i=0;i<ix_x;i++)
{
LCD_set_XY(X+i,Y+n);
LCD_write_byte(map[i+n*Pix_x], 1);
}
}
}
#endif
|
|