最新日志

发表于:2008-4-19 21:32:42
标签:深入剖析人民币升值背后  

0

深入剖析人民币升值背后ZT(转载)

相信大家对80年代的“日本经济衰退”和90年代的“亚洲金融风暴”及“香港的香港金融保卫战”吧!也许有人会说那是国际投机集团“美国索罗斯财团”搞的,但是,你就没有想过它背后难道就没有美国政府的支持了吗?下面,我仔细分析一下这些事件的前因后果你就会明白了。

从1980 开始的,特别在1990年和1995年,第一名的美国和第二名的日本之间的GDP差距是多少?日本GDP超过美国GDP的一半!这也是目前为止唯一一次其它国家和美国的经济差距缩小到一半的程度。日本人在欢呼:只要超过美国的GDP,日本就可以恢复“正常国家”了!美国人没有吭声。

按理说,日本还是美国的盟国,其经济也是美国扶持起来的,美国也没有分裂日本的必要(要分裂,二战时就分裂了,也不用等到80-90年代)。美国也不可能对盟国日本使用“颠覆性煽动”,眼看着美国是阻挡不了日本经济的发展前景的了!世界各国都在兴奋的期待着日本GDP超过美国GDP的那个“历史性时刻”!日本企业更加疯狂,美国经济的象征——洛克菲勒广场被日本人买下了!美国的精神象征——好莱坞被日本人买了!美国人民的心情一下子掉到了谷底。“世界第一” 就快保不住了!美国人民的荣耀感在急剧下滑,民间开始蔓延仇日情绪。

1980年,日本的GDP就快到美国的一半了。有一件事情在 1985年发生了,1985年美国拉拢其它五国(7国集团)逼迫日本签署了广场协议。以“行政手段”迫使日元升值。其实的一个中心思想就是日本央行不得 “过度”干预外汇市场。日本当时手头有充足的美元外汇储备,如果日本央行干预,日元升不了值。可惜呀,日本是被去了势的太监。美国驻军、政治渗透、连宪法都是美国人帮它度身定做的,想不签广场协议都不可能。

日本最后的结局大家也知道了。1985年9月的广场协议至1988年初.美国要求日元升值。根据协议推高日元,日元兑美元的汇率从协议前的1美元兑240日元上升到1986年5月时的1美元兑160日元。由于美国里根政府坚持认为日元升值仍不到位,通过口头干预等形式继续推高日元。这样,到1988年年初,日元兑美元的汇率进一步上升到1美元兑120日元,正好比广场协议之前的汇率上升了一倍

美国人满足了吗?没有。接着看下去,从1993年2月至1995年4月,当时克林顿政府的财政部长贝茨明确表示,为了纠正日美贸易的不均衡,需要有20%左右的日元升值,当时的日元汇率大致在1美元兑120日元左右,所以,根据美国政府的诱导目标,日元行情很快上升到1美元兑 100日元。以后,由于克林顿政府对以汽车摩擦为核心的日美经济关系采取比较严厉的态度。到了1995年4月,日元的汇率急升至1美元兑79日元,创下历史最高记录。

日元升值的后果是什么?洛克菲勒广场重新回到了美国人手中,通用汽车在这个广场的一卖一买中净赚4亿美元!日资在艰难度日中大规模亏本退出美国。美国人民胜利了!成功的击退了日本的经济进攻!我们可以从事例中看看1995年之后,日本和美国的GDP之比重新拉开了距离,而且越来越大!

可能有些网友还是没有明白,日元升值怎么啦?跟我们的谈论有什么关系?日元升值,就是美国对日本的一次经济阻击战!成功的把日本20多年的发展财富大转移到了美国去了。

下面我给个例子大家就清楚了。

假设我是美国财团,我当然知道1985会发生什么,假设我在1983年吧,我用100亿美元兑换成24000亿日元,进入日本市场,购买日本股票和房地产,日本经济的蓬勃导致股市和房地产发疯一样的上涨,1985年广场协议签订,日元开始升值,到1988年初,股市和房地产假设我已经赚到了一倍(5年才翻一倍是最低假设了),那就是48000亿日元。

这时,日元升值到1:120。我把日本的房地产和股票在一年中抛售完,然后兑换回美元,那么,就是400亿美元!在5年时间中,我净赚300亿美元!(还是最低假设)。那么日本呢?突然离开的巨额外资就导致了日本经济的崩溃!经济学用词叫“泡沫经济破灭”。这就是日本常说的:“失去的十年”。而我连本带利的400亿美元回到美国,你想一想,美国经济能不旺盛吗?!!日本“失去的十年”,却正是美国“兴旺的十年”!看看我的上表就知道了。
我只是美国财团中的一个,其它财团呢?嘿嘿,而且我的假设还只是到1988年,如果是到1995年,日元升值到1:79,你我能想象美国在这场经济战争的胜利中,到底从日本刮走了多少财富?

美国赚够了,日元现在又重新回到了1:140的位置上,美元的坚挺依然和30年前一样!美元暂时性的贬值,并没有损害到美元的国际地位。这场美日的经济战争,以美国完胜而告终!!

美国人玩上瘾了。1998年,同样的手法在东南亚四小龙四小虎身上又来了一次,这就是亚洲金融风暴!唯一不同的,这次不需要广场协议了。因为亚洲这些小虎小龙的外汇储备们直接阻击就可以大获全胜!但是,还是没有战胜财大气粗、军事强盛、奉行霸权主义的美国,结局大家也看到了,东南亚货币在先升后跌中,经济发展的成果被美国抢掠一空!!

唯一市场硬挺住了索罗斯的进攻而没有经济崩溃的就只有回归后的香港,保住了香港几十年的发展果实。当时索罗斯发动世界舆论(包括香港舆论),大肆攻击香港政府(中国政府)“行政干预市场”,违反市场经济规则、没有民主自由,要是当时中国屈服于世界的舆论压力而不运用“宏观调控”进行入市干预,那将酿成大祸,又不知道要有多少国人向当年的日本那样因破产而跳楼自杀了!

当时的曾荫权后来说过: “决定政府入市干预的前一晚,我坐在床头哭了,不是为我自己,而是怕这个决定如果错误了,害了香港,我怎么向中央政府向市民们交代。”大家现在知道为什么美国一再要求他国“新闻自由”、“市场经济”、“民主人权”是建立在自己利益的基础上了吧,知道我国的“宏观调控”政策的正确性和优势所在了吧。

美国停手了吗?没有,因为我过综合势力的增长国力的增强威胁到了美国的根本利益和“世界第一”的权威,近来“中国公开支持因儿子丑闻陷入困境的安南,指责美国故意借题发挥进行人生攻击。”就是最好的证明。所以美国心里就不痛快了,就要整人了,现在强迫人民币升值就是消弱中国的第一步,各位明白了吗?知道为什么中央政府突然狂力打压上海和北京的房地产市场?知道为什么中国股市那么惨了吗?央行行长周小川在3月还是4月曾说了一件事情:“有一个40亿美元的外资在上海炒房地产,已经退出中国了这样的外资,不要也罢!”明白了吗?中国股市是一个弱势股市,很容易被美国财团利用。

中央不可能放松对股市的控制,否则中国经济将会在外资的攻击中崩溃!前段时间,也就是今年的12月初又有一个240亿美元的外资财团撤离中国上海。现在,大家对国家的宏观调控的优势有所理解了吧,知道了国家出台那么多针对房地产的政策是多么的明智和及时了吧(文件详文附在后面,有兴趣的可以读读)!

现在各位知道为什么中国要实行国家外汇管制、汇率控制、打压房地产、控制股市、知道为什么中国要保持巨额外汇储备,为什么最近央行又出台了新的房地产贷款规定,为什么中国政府一直要求进出口贸易平衡,为什么要扩展东南亚贸易市场和欧盟市场,为什么要加WTO了。

其实中美之间的经济战争,早就已经开场了,而且来来回回过了几百招了。我们大多数网友还懵懵懂懂的只盯着台海,盯着中亚美军又多了一个军事基地。要知道经济崩溃的灾难远比一场军事战争的后果更严重。军事战争不外乎两种:即“侵略战争”和“卫国战争”。而军事上的“侵略战争”的最终目的就是打垮对方的一切(军事力量和经济实力)达到占领对方领土,进行资源掠夺和控制奴役和剥削对方的国民。

这样的事情中国历史上没有少发生,这里我就不例举事例了。而如今的美国就是以军事上的侵略战争为手段,达到奴役和剥削对方为目的的真实意图(对实力弱小的国家而言),看看如今的“伊拉克”就明白了,美国实际上是侵略占领了伊拉克,控制了伊拉克的石油,以此来满足美国国内巨大的需求量;而对实力强的原苏联(原苏联拥有制对方死地的核力量),美国就只有发动经济进攻来拖垮他们,苏联的分裂就是最好的例子。

也许有的人要说,那是冷战时期的军备竞赛和当时苏联国内政策导致了原苏联因经济崩溃而解体的。但是,你有没有想过,进行军备竞赛是以经济实力为基础的。当时的美国经济实力比苏联强,所以,美国胜利了而苏联解体了。现在轮到我们了,我国现在的经济和军事实力都没有冷战时期的苏联强大,相同点是我国同样也拥有毁灭美国的核武器,只是数量少了一点而已。那在这一轮中,就要看我国领导人的智慧了,建立合理的政策来规避风险,保护自己是当务之急(可喜的是,现在我国已经在这样做了)。

可是,美国也没有闲着,而且,作为经济进攻的第一步他们已经早早的迈出了,向美国“凯雷财团”这样的世界性投机财团收购中国的“徐州重工”这样的事情已经发生了很多了,在这里我就不一一例举了。他们的目的很明确,控制中国的核心技术,进行世界性的技术垄断,迫使??量。同时乘汇率没有变化之前以美元套取人民币,迫使中国央行大量发行人民币以应付大量的货币兑换需求,为拖垮中国经济打下伏笔。这还是明的进入,暗地里的就更无法统计了。
说到这里,也许有很多人不明白大量美元兑换人民币的行为与拖垮中国经济有什么关系。在这里,我解释一下:在没有大量美国财团恶意涌入中国用大量美元换取人民币之前,我国的经济形式是相对稳定的,但是,实际上,我国发行的人民币的数量远没有我国人民积累的财富数量那么多,因为,任何一种货币,只要能保证本国正常的经济活动就行了,??为印刷货币的成本是很高的。

举个例子:中国有13亿人口,平均每人的财富拥有量为1万元每人,中国总共有13万亿元财富,而现实生活中,每个人不可能把自己的全部财富都带在身上,这里就平均一下,平均每个人身上携带1000元现金(携带量为10%,其实这个量已经是很大了),其余的存在银行,也就是说,在正常情况下的流动现金量(术语为:现金流量)为1千亿元,乘以一定的突变系数,(这里为了便于计算,就理想的取值100%),也就是说在正常的经济活动下,中国只要发行2千亿人民币就可以满足本国的经济活动了。

而大量的恶意的国外财团的资金涌入中国,表面上是拉动了我国的经济,是国内的消费量变大,也就是使国内的现金流量的需求变大,这样,我国为了满足大众消费的需求,就会大量印刷和发行人民币来满足这种需求(当年的日本就是这样)。据统计,目前在国际上金融市场上的投资有136万亿美元。

其中只要有1%涌入中国进行投机经营,按现在的汇率,我国就要发行10.895584万亿元人民币(1.36*7.8644=10.695584+0.2=10.895584万亿元),货币的发行总量已经超过了我国现有的外汇储备量(1万亿美元)的 10倍,算把中国的全部外汇储备都拿来也难对付对手,此时,我国的国有经济就是负9.895584万亿元,不能算上全中国人民的全部财富,因为,国家经济崩溃了,我们手中的财富也就一文不值了。

如果人民币升值以后,他们再用手头的人民币套取美元,中国国内将会余留大量人民币。那样,国人乃至世界将会对中国失去信心,不再储备和使用甚至抛售手中储备的人民币,使中国的外贸活动受挫,最终导致中国国内的通货膨胀,对外导致信誉危机从而导致金融危机。就向40年代的通货膨胀那样一盒火柴要卖几百块。如果我国政府在这次的人民币汇率这件事上决策错误,那么到时中国近30年来改革开放的经济成果就可能就可能落入他人之手。

最近,国内的经济形式来看,客观的将,形式是不容乐观的。按理说,人民币升值了,也就是说钱值钱了,应该是以前1块钱的东西现在只要9毛甚至是8毛就可以买到了;可是现在的国内形式,除了工资没有涨外其余的都涨了。

新华网报道说:自8月份开始,北京市场食用油价格震荡上扬。进入11月份,米价、面价、菜价及副食价格均有不同程度的攀升。报道认为,是受国际大豆市场价格上扬的影响,导致食用油价格上升。但是,米面跟风而涨,25公斤装的富强粉涨幅达12%以上,500克大米上涨了6分钱。据了解,在上海、广州、深圳粮油等生活必需品已是涨升一遍,并持续一个多月,其中面粉、食用油的最高涨幅分别已达一成和二成。

农副产品涨价说明了我国经济在发展和提高。同时,以农副产品的涨价来增加农民的收入,维护社会的稳定,给国家的发展提供了一个良好的国内环境,对国家的发展是有好处的,因为中国农民的数量毕竟占了总人口比例的70%以上嘛。

但是,中国的这四大城市生活必需品的涨价决外偶然。持续7个多月的宏观调控并没有稳定房价,相反,导致房价的节节攀升。早有经济学家警告说,地产泡沫将导致通货膨胀,通货膨胀将引发经济危机。然而,这种声音太微弱,现如今的种种迹象表明,通货膨胀正在步步逼近我们。

对比1996年的东京,1997年的香港,北京、上海、广州,深圳这四大房价居高不下的城市,地产泡沫破灭前的迹象已经显现。试图为了一已私利而继续哄抬房价的地方政府,将迎来经济规律的无情惩罚。因为这一轮的通货膨胀是在毫无防备的情况下发出的,可能还不被官方承认,但它实实在在已经来临了。这种处在萌芽状态的通货膨胀选择了一个导致经济危机的最好时机——2007年的元旦和春节前。因此,危害性和破坏性更大。如果有一天方便面也开始涨价时,这场经济危机已无法遏制了。

柴米油盐、水电油汽的轮番涨价和全面涨价,对中国的富豪阶层的正常生活不构成任何影响,但是千千万万的普通市民将要付出更多的财富以维持和原来一样的生活水准,也就是说,中国的高房价,间接地是由普通城市居民来买单,日本的国民是花了15年的时间,香港的市民就是花了14 年。那么,中国的城市居民要花多少年呢?

应对即将到来的通货膨胀,国家自然有金融的手段。可是,中国的人民币在国际市场受到美元的攻击,一年之内升值达5%,而且,还有继续升值的空间。中国的贸易顺差将在人民币的升值中逐渐缩小,国际市场的风险已在加剧。而国内市场生活必需品的全面涨价,将直接影响消费。最后,逼迫央行加大人民币的发行量,中国的通货膨胀就此爆发。这种危机也可能近在眼前。

人民币目前在国际货币市场的遭遇是中国汇制改革以来没有过的事,我们目前已经知道美元要干什么?但是,还由不得我们把国际市场的问题解决好,人民币在国内又是这样的尴尬。在不动产涨价的带动下,生活必需品全面涨价,形成了国际与国内两种迥然不同的市场。从某种意义上来说,这样的市场将走向资本的过度投机。说白了,对内将加剧中国社会的贫富分化,对外给资本大鳄可乘之机。

如果更深层次的分析,人民币似乎是遭遇来自不同方面的围攻,试图将中国30来年经济发展的成果逐步蚕食。接下来,生活必需品的涨幅将进一步加剧,市民的购买力进一步下降,国内市场进一步缩小,中国的产能将进一步过剩,最后,必然导致大量的中小企业破产,经济危机说来就来。

真正要化解这场危机,对目前的经济局势来说,进一步加大宏观调控的力度,理顺房地产市场的管理体制,采取有力措施,坚决把房价降下来,让城市居民在房价下降的过程中感受中国经济的力量,从而增强对未来的信心。也许,这是目前最应该做的一件事,尽管已经做了一些表面工作。

我们要清醒地看到高房价的危害性,尤其是对中国社会的破坏更是史无前例。也许现在还不必过于悲观,一切都应该有转机。谁都知道中国经济发生了重大问题,就象一辆出现明显故障的高速列车,轰轰隆隆往前飞奔,不知何时将会出轨或者颠覆。有经济学家预言,2008年中国经济将会硬着陆,届时,社会动荡不可避免。

那么,出了这么大的问题,而问题的症结究竟何在呢?

发改委专家马晓河指出:我国正在由某一方面的过剩向全面过剩演变。由于产能过剩,内需不旺,中国产品被迫出口,又导致了大量的贸易摩擦,过分依赖国际市场的风险越来越大。马晓河举例说:中国人向世界上的每一个人提供了一双鞋子,可见鞋的产能过剩多少。11月23日,央行副行长苏宁也表示,中国最终消费占 GDP比重已从上世纪80年代超过62%下降到2005的52.1%,居民消费率也从1991年的48.8%下降到2005年的38.2%,均达到历史最低水平。而在中国居民消费率持续下降的同时,世界平均消费率达78%—79%,比较起来差别之大就如天上和地下。

上面两位,一位是宏观经济的专家,一位是金融权威,但指出的是一个共同问题,就是因为内需不旺而导致产能过剩,一旦国际市场出现大的风险,中国将有成千上万工业企业面临生存的危险。

让我们再来看看近几年推动中国经济高速发展的动因是什么:如果总揽中国经济全局就可以发现,推动中国经济高速增长的一是投资,二是消费,三是出口,可以说这是并驾齐驱的“三驾马车。”但是,在我国的实践中是“重投资、重出口、轻消费,”这是问题的表象。为什么中国人会“重投资、重出口、轻消费,”呢?明知消费是生产力,没有消费就没有生产力,这是一个浅显的经济学常识,但是在宏观经济发展的布局上,连马克思的剩余价值理论都不顾及了?

再仔细分析,就会发现很有趣的现象:一是地方政府重投资,前几年表现的是“开发区”热,后来是“基本建设”热,再后来就是现在的“房地产”热;二是大中型企业重工业产品出口,不管是上市公司还是民营企业,只要形成了生产规模,眼光都瞄准了国际市场,大到汽车,家电,小到鞋子,袜子,打火机,一古脑出口。就 “投资”热而言,高房价圈走了老百姓甚至两代人的财富,还有一代人背上了沉重的债务;就“出口”热而言,贸易顺差继续加剧,贸易摩擦不断增多,人民币升值压力越来越大。

有经济学家分析,人民币自汇率改革以来升值了5%,现在的状况是有可能2007年一年就要升值5%,相当于前10 多年的升值总幅度。那么这个后果是什么呢?许多经济学家讳莫如深,我可以大胆的告诉大家,后果就是人民币大量从不同渠道流出境,国际洗黑钱的势力乘机介入,甚至可以把中国贪官的钱都洗白了。

可以说,在2007年之前,只听说外国人到中国来洗钱,这个局面也将因此而改变,中国人终于到外国去洗钱了。再说得深入一点,就是中国人民创造的财富被别人悄悄地“盗走”了,而“盗匪?发改委专家马晓河先生的话头上,看看如何解决产能过剩的问题。其实,很简单,产能过剩的解决之道是刺激消费,而刺激消费的唯一办法就是降低房价。房价不降,中国人对未来的预期必将产生较大的压力而不敢消费,还有一部分成了房奴无钱消费。马晓河先生说,中国工业品利用率有半数低于50%,所以,为了减少风险,必须扩大内需。而内需如何才能扩大呢?

中国居民的消费率是38.2%,世界平均消费率是78%—79%

中国居民平均房价收入比是一比十,世界平均房价收入比是一比多少忘了!

两相对照,中国经济问题的症结就暴露出来,是高得离谱的房价将中国居民的财富搜刮一空,还拿什么去消费呢?所以中国人的消费率创下了历史新低。有专家预测,中国房价每下降一个点,将为市场一年增加100亿以上的消费,而中国房价从2006年前三季度的综合平均价位上,至少有30%以上的下降空间,也就是说,只要中国房价下降30%,中国市场一年将增加3000亿的消费总额,中国经济的问题也迎刃而解,中国民众也从此能过上好日子。

相反,我国要是领导人的决策事物就控制不好这个局面,我国的经济将会崩溃,国内将??我国的国力衰弱后,必将遭受外强的军事打击。我们都清楚我们现在身处的国际环境有多恶劣。面对当前复杂的国际形势,中国一定要具备打赢两场战争的能力,一是军事战争,二是经济战争。

用战争手段夺取别国别人的财富在人类历史上是很常见的。即使在21世纪的今天也还能看到。为了保护中国人民的生命财产,以及可能爆发的军事冲突,中国一定要建设强大的陆军,强大的海军,强大的空军和强大的天军(太空部队)。

在人类进入21世纪的今天,谁占领了太空这个制高点,谁就掌握了未来战争的主动权。任何太空非军事化的想法,只能是白日做梦!

落后是要挨打的!中国只有具备了彻底摧毁对手的实力,别人才不敢欺负中国。
同时,在人类进入21世纪的今天,由于国际交流和贸易的全球化,一场新的战争----经济战争,已经取代军事战争,成为当今世界一部分人夺取另一部分人财产的主要手段

1997年东南亚的金融风暴就是经济战争的一个例子。落后的东南亚国家经济受到了重大打击。国际金融炒家以经济手段达到了以往要用战争手段才能达到的目标。

在少迟一点的香港金融保卫战中,时任香港政务司司长的曾荫权和财政司司长任志刚,在中国中央政府的支持下,用大量外汇储备干预了香港的股票市场。中国中央政府派出了两名央行副行长到香港,要求香港的全部中资机构,全力以赴支持香港政府的扶盘行动。经过几个月的较量,香港政府成功击退了国际金融炒家把香港当作提款机的企图。那次的斗争是非常激烈的,香港恒指变动1点,期货的买卖就会相差2.3亿港币。

香港金融保卫战虽然过去好多年了,我一直在想,如果没有强大中国做后盾,会不会发生“八国联军”攻打香港的可能呢?毕竟香港政府干预香港股票市场违反了当今国际主流社会的“规矩”。

中国航油(新加坡)在国际石油期货市场损失5亿美元和一位中国国资委职员在伦敦同期投资再次被吃表明中国在金融市场方面还有很多东西要学。

就石油这一项,中国现在每年就要多花几百亿美元。现在是中国需要啥,国际商品市场就涨啥。可以说是“抢你没商量”。

然而,石油等商品的价格对中国经济的危害并不是最严重的。真正可能对中国经济的造成严重危害是人民币汇率体系和不断高涨的房地产市场

我总觉得有人要以人民币汇率为突破口,搞垮中国的经济,夺取中国人民的经济成果。从要人民币升值和自由浮动的叫喊声中,我好像闻到了军事战争的火药味。

现在有一个说得比唱得还好听得说法,让人民币汇率自由浮动,由市场来决定。

难道市场是有鬼决定的吗?由市场来决定,听起来挺公平的,大家都有权。但仔细分析一下,世界上有哪个市场不是由少数人操中的呢?让人民币汇率由市场来决定,说穿了就是由他们来决定。

中国政府和人民一定不要忘记1997年东南亚的金融风暴。现在外资的相当一部分是埋下的伏兵。它们就等美国把中国的门撞开(人民币汇价自由浮动),把人民币捧上天,牟取暴利。

总之,中国一定要建设具有一不怕苦,二不怕死精神的强大的陆军,强大的海军,强大的空军和强大的天军(太空部队)以应对可能军事战争。同时中国一定要建设热爱国家,具有国际视野,精通国际竟争规则的金融“铁军”以应对经济战争。只有这样,中国的安全,人民的财富才会得到保护!

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(88)
发表于:2008-3-15 12:12:51
标签:密码锁  

0

基于FPGA的密码锁

采用4X4键盘电路,和一个四位动显示电路.来完成基本的控制功能 .
1.4X4 键盘扫描电路的设计
电路中分为键盘去抖电路和键盘译码电路。弹跳消除电路所使用的频率必须比其它电路的
工作频率高,扫描电路的工作频率为24HZ左,则去抖电路的工作频率是前者的4倍,或者更高,
为128HZ左右。在此次电路设计中去抖动电路频率为250HZ,键盘扫描频率为25HZ。
2.四位动态数码管显示电路
电路中扫描频率为250HZ,其中每段数码管的频率不得低于42HZ,否则会出现频闪现象。
3.FPGA 控制电路。
电路中设计中,分为数字键,和功能键,当按下四位数字键时,按下激活电锁键,则这四位
数字键将作为该密码的当前密码。只有在按下正确密码时,并按下功能键清除/解除电锁键,
时,密码被激活。解锁。

pdf

点击此处查看原文 >>

系统分类: 汽车电子   |    用户分类:    |    来源: 原创

评论(0) | 阅读(223)
发表于:2008-3-13 18:43:49
标签:简易电压源  

0

简易电压源

/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.8c Professional
Automatic Program Generator
?Copyright 1998-2006 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project : 简易直流电压源
Version :
Date    : 2007-5-18
Author  : F4CG                           
Company : F4CG                           
Comments:


Chip type           : ATmega16L
Program type        : Application
Clock frequency     : 8.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega16.h>
#include <delay.h>
#include "1602a.h"
#define ADC_VREF_TYPE 0xc7//内部基准电源,单通道输入PA7
unsigned int adc_v; 

int key_stime_ok,key_stime_counter;
void adc_to_disbuffer(unsigned int adc)
{
 // #asm("cli")
  
 //  LcdPos(6,0); //确定光标位置
  // LcdWd(adc%10+0x30);
   adc="adc/10";
   LcdPos(5,0); //确定光标位置
   LcdWd(adc%10+0x30);
   adc/=10;
     LcdPos(4,0); //确定光标位置
   LcdWd(adc%10+0x30);
   adc/=10; 
    LcdPos(3,0); //确定光标位置
   LcdWd('.');
     LcdPos(2,0); //确定光标位置
   LcdWd(adc%10+0x30);
   adc/=10;
//#asm("sei")
}   
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
// Place your code here   

if (++key_stime_counter >=1)
  { 
  key_stime_ok = 1; 
                  }
}
// ADC interrupt service routine
interrupt [ADC_INT] void adc_isr(void)
{
  unsigned int adc_data;
// Read the AD conversion result
adc_data=ADCW;

// Place your code here
adc_v=(unsigned long)adc_data*2560/1024;    //换算成电压值
  adc_to_disbuffer(adc_v);  
   
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here
//char j="88";
// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0xff;//液晶接口
DDRB=0xff;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0xff;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0xff;     
DDRD=0xff;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top="FFh"
// OC0 output: Disconnected
TCCR0=0x0C;//采用比较模式,256分频   8M/256=31.25K
//TCCR0=0X0D;//1024   7.81k
TCNT0=0x00;
OCR0=0x40;// (61+1)/31.25   =2ms
 // OCR0=0XFF;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top="FFFFh"
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top="FFh"
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x02;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// ADC initialization
// ADC Clock frequency: 125.000 kHz
// ADC Voltage Reference: Int., cap. on AREF
// ADC Auto Trigger Source: Timer0 Compare Match
ADMUX=ADC_VREF_TYPE;
ADCSRA=0xAE;
SFIOR&=0x1F;
SFIOR|=0x60;

// Global enable interrupts

RstLcd();//液晶初始化
RstLcd();//液晶初始化
RstLcd();//液晶初始化
/*
LcdPos(0,0);//x,y
LcdWd(j%10+0x30);  
LcdPos(1,0);//x,y
j=j/10;
LcdWd(j%10+0x30);
//j=j/10 ;
LcdPos(2,0);//x,y
LcdWd('=');
LcdPos(3,0);
//Write_String(str);
lcd_putsf("JIANGLONGJIAN");
//LcdWd('b');*/
  LcdPos(0,0); //确定光标位置
  LcdWd('v');
  LcdPos(1,0); //确定光标位置
  LcdWd('=');
  #asm("sei")
while (1)
      {
      // Place your code here
   //   if (key_stime_ok==1)
    // { key_stime_ok=0;
     //  adc_to_disbuffer(adc_v);
      // } 
 
      };
}
c

点击此处查看原文 >>

系统分类: 汽车电子   |    用户分类:    |    来源: 原创

评论(0) | 阅读(270)
发表于:2008-3-13 18:41:33
标签:1302  

0

基于1302的万年历

这个是1302程序,液晶用12864来显示

rar

点击此处查看原文 >>

系统分类: 汽车电子   |    用户分类:    |    来源: 原创

评论(0) | 阅读(304)
发表于:2008-3-13 18:38:38
标签:模拟SPI接口  

0

模拟SPI接口程序

//***********************************************************
//功能      : 由AVR作为主机,向FPGA发送数据,采用模拟SPI接口来实现
//            互相通信 
//作者      : 小白龙
//创建日期  : 2007.8.1 
//版本      :  V1.1
//修改日期  :2007.8.12
//************************************************************
#define clk_r       PORTD.0  //所有IO口初始时设为输出口
#define data_r      PORTD.1
#define ss_r        PORTD.2

#define clk_s       PORTD.3
#define ss_s        PORTD.4
#define data_s      PORTD.5
#define data_sPIN   PIND.5
#define data_sDDR   DDRD.5 
#define IO_PIN      PIND
#define IO_DDR      DDRD.1  //数据读入口
 uchar spiread(void);
void spisend(uchar data);


/**********************************************************
*
*功能:模拟SPI接口程序,低位先发送,最后发送高位,
      FPGA接收数据往左移动,即先接收高位 ,二者顺序发送和接收数据相反
*说明:在CLK的上升沿开始写入数据,开始时SS位片选信号,
      当SS由高变低时,产生时钟信号,开始传送
*********************************************************/
void spisend(uchar data)//写入
{  
    uchar i;
    data_sDDR=1;
    clk_s=0;
    for(i=8;i>0;i--)
 {
  if ((data&0x01)==1)
   {
   data_s=1;
   }
  else
   data_s=0;
   delay_1us();
  clk_s=1;
 // delay_1us();
  clk_s=0;  
  data>>=1;//右移一位
 }
}
/**********************************************************
*
*名称:spiread()
*功能:AVR作为主机,由AVR提供时仲,从FPGA取数据
*说明:在CLK的下降沿开始读数据,FPGA的数据从高位开始发送,
      AVR中接收的数据先送到低位中
*********************************************************/
uchar spiread(void)
{
 uchar i;
 uchar data="0x00";
 uchar temp; 
 IO_DDR=0;  //IO口作为输入,DDR要写0 
 ss_r=0;
 clk_r=0;  
 for(i=0;i<8;i++)
 {   
  clk_r=1;
  clk_r=0;     
  temp="IO"_PIN;
        if (temp&0x02)       //下降沿采集数据,调换则会出错
 data|=(0x01<<i);
 
 }
 IO_DDR=1;
 ss_r=1;  //读完数据后,SS拉高,同时时钟拉高一次,上升沿重新置数
 clk_r=1;
return(data);
}

// 
//
// PORTA="0x00";   //灯指示
// DDRA="0XFF";
//
// PORTB="0x00";//0101 0000
// DDRB="0x07";//0000 0111接口作为模拟SPI口输出接口要写1
//
// PORTC="0x00";
// DDRC="0x80";
//
// DDRD="0xff";//0000 0001
// PORTD="0x00";//0100 1000
//         // SPUL="1",CL=1;
//
// // Timer/Counter 0 initialization
// TCCR0=0x0b;//采用比较模式,256分频   8M/256=31.25K
// TCNT0=0x00;
// OCR0=0x3D;// (61+1)/31.25   =2ms
//
// // Timer/Counter 1 initialization
// TCCR1A=0x00;
// TCCR1B=0x00;
// TCNT1H=0x00;
// TCNT1L=0x00;
// ICR1H=0x00;
// ICR1L=0x00;
// OCR1AH=0x00;
// OCR1AL=0x00;
// OCR1BH=0x00;
// OCR1BL=0x00;
//
// // Timer/Counter 2 initialization
// ASSR="0x00";
// TCCR2=0x00;
// TCNT2=0x00;
// OCR2=0x00;
//
// // External Interrupt(s) initialization
// GICR|=0x40;
// MCUCR="0x03";
// MCUCSR="0x00";
// GIFR="0x40";     //通过写1来清0
// // Timer(s)/Counter(s) Interrupt(s) initialization
// TIMSK="0x02";
//
// // Analog Comparator initialization
// ACSR="0x80";
// SFIOR="0x00";
// ss_r=1;
// //PORTB.1=1;
// key_init(); //键盘初始化
// #asm("sei")   // 开放全局中断
//  
// while (1)
//       {
      // Place your code here
//***********************键盘处理*******************************//
//       
// if (key_stime_ok)    10ms到,键处理
//           {
//      key_stime_ok = 0;
//               switch (read_key())  调用按键接口程序  
//        {
//        case 1:
//    {
//     ss_r=0;  在接收数据时要先拉低
//     PORTA="spiread"();
//     ss_r=1;
//    clk_r=1; 
//            }  break; 
//         case 2:
//            {
//            ss_s=0;
//     spisend(0x80);
//     ss_s=1;
//            }break;
//         case 3:
//         {
//           ss_s=0;
//     spisend(0x00);
//     ss_s=1;
//            }
//            break;
//        case 4:
//        { 
//          }
//          break;
//          }
// }end keyproc
// 
// }end while
// }

点击此处查看原文 >>

系统分类: 汽车电子   |    用户分类:    |    来源: 原创

评论(0) | 阅读(352)
发表于:2008-3-13 18:36:09
标签:电机调速  

0

电机调速控制系统_主程序

这个是电机调速控制系统的程序,单片机是AVR的mega16,采用液晶显示,电路图在前面已经发过了。

#include <mega16.h>
#include <math.h>
#include <string.h>
#include <stdio.h>
#include "first.c"
#include "pid.c"
#include "delay.c"
#include "key_4.c" 
#include "1602a.c"
// Declare your global variables here
bit s1; //停止/开始
bit s2; //正转反转

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
TCNT0=0x83;
  
 if(++tc>250)
   {  
     tc="0";
    #asm("cli"); 
    read="1";
    }
   if (++key_stime_counter >=3)//定时10MS
  {      
   key_stime_counter = 0;
   key_stime_ok = 1; 
                 }
}  
// External Interrupt 0 service routine
interrupt [EXT_INT0] void ext_int0_isr(void)
{
//read=1;
counter++;
}//end interrupt
 
/**************************读取计数值显示************************/
void read_counter()
{
   unsigned int sett;
   unsigned int count;//计数值    
    count="counter";
   count=(count*60);
  count="count">>3; 
  LcdPos(0,1); //确定光标位置
  LcdWd('p');  //个位 
  LcdWd('r');  //
  LcdWd('e');
  LcdWd('='); 
  LcdPos(11,1); //确定光标位置
  LcdWd('s');  //
  LcdPos(10,1); //确定光标位置
  LcdWd('/');  //
  LcdPos(9,1); //确定光标位置
  LcdWd('n');  //
  LcdPos(8,1); //确定光标位置
  LcdWd(count%10+0x30);  //个位
 
  count/=10;  //十位
  LcdPos(7,1); //确定光标位置
  LcdWd(count%10+0x30);    
 
  count/=10;  //百位
  LcdPos(6,1); //确定光标位置
  LcdWd(count%10+0x30);
  count/=10;  //千位
  LcdPos(5,1); //确定光标位置
  LcdWd(count%10+0x30);
  count/=10;  //万位
  LcdPos(4,1); //确定光标位置
  LcdWd(count%10+0x30);

     sett="set";
     LcdPos(0,0);
     LcdWd('s');
     LcdWd('e');
     LcdWd('t');
     LcdWd('=');     
  LcdPos(11,0); //确定光标位置
  LcdWd('s');
  
  LcdPos(10,0); //确定光标位置
  LcdWd('/');
   
  LcdPos(9,0); //确定光标位置
  LcdWd('n');
  LcdPos(8,0); //确定光标位置
 
  LcdWd(sett%10+0x30);
  sett/=10;
 
  LcdPos(7,0); //确定光标位置
  LcdWd(sett %10+0x30);    
  sett/=10;
 
  LcdPos(6,0); //确定光标位置
  LcdWd(sett%10+0x30);
 
  sett/=10;
  LcdPos(5,0); //确定光标位置
  LcdWd(sett%10+0x30);
  sett/=10;
 
  LcdPos(4,0); //确定光标位置
  LcdWd(sett%10+0x30);   
  counter="0";
    #asm("sei");
}//end read_counter
/***************************主函数***********************************/
void main(void)
{
   
    double      rOut;                   //  PID Response (Output)
    double      rIn;                    //  PID Feedback (Input)
   PIDInit ( &sPID );                  //  Initialize Structure
   ocr="700";
  set="1500";
    sPID.Proportion =1.5;              //  Set PID Coefficients
   // sPID.Integral   = 0.683;
   // sPID.Derivative = 0.683;
  sPID.SetPoint =set;            //  Set PID Setpoint
  sPID.SetPoint=sPID.SetPoint/60.0;
  #asm("cli");

PORTA=0x00;   //液晶
DDRA=0XFF;
PORTB=0x00;
DDRB=0x0F;//0000 1111  
PORTC=0x00;
DDRC=0x00;
PORTD=0x30;//0000 0000  PD2外部中断入口
DDRD=0x30;//0011 0000

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 125.000 kHz
// Mode: CTC top="OCR0"
// OC0 output: Disconnected
TCCR0=0x04; //定时4MS*500
TCNT0=0x83;
OCR0=0x82;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 1000.000 kHz
// Mode: Ph. correct PWM top="00FFh"
// OC1A output: Non-Inv.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xc3;//选通OC1A
TCCR1B=0x01;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x03;
OCR1AL=0xff;
OCR1BH=0x03;
OCR1BL=0xff;//对应着PD4口的PWM波,
// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top="FFh"
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// INT2: Off
GICR|=0x40;
MCUCR=0x03;
MCUCSR=0x00;
GIFR=0x40;  //通过写1来清0
 

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
RstLcd();
key_init(); //键盘初始化
#asm("sei")   // 开放全局中断
 
while (1)
      {
      // Place your code here
//***********************键盘处理*******************************//
      
      if (key_stime_ok)    // 10ms到,键处理
          {
             key_stime_ok = 0;
              switch (read_key())   // 调用按键接口程序  
               {
             /****************复位******************/ 
               case 1:
    { 
    /************键值处理**************/
      s1=!s1;
      if (s1)
      {
        RR
         LcdPos(14,1); //确定光标位置
                       LcdWd('R');  //
                       LcdPos(12,0); //确定光标位置
                       LcdWd('R');
                       LcdWd('U');
                       LcdWd('N');
                       LcdWd(' ');
        }
       else
       {
         ocr="0";
         ST
                      LcdPos(12,0); //确定光标位置
                      LcdWd('S');
                      LcdWd('t');
                      LcdWd('o');
                      LcdWd('p'); 
                      }              
                                 
                   }  break; 
                      case 2:
                   { 
                      s2=!s2;
                      if (s2)
                      {
                        ocr="0";
                        RR//电机正转
                        ocr="700";
                        LcdPos(14,1); //确定光标位置
                         LcdWd('R');  //
                        LcdPos(12,0); //确定光标位置
                          LcdWd('R');
                      LcdWd('U');
                      LcdWd('N');
                      LcdWd(' ');
                      }
                      else
                      {
                      ocr="0";
                      LL
                      ocr="700";
                      LcdPos(14,1); //确定光标位置
                      LcdWd('L');  //
                      LcdPos(12,0); //确定光标位置
                      LcdWd('R');
                      LcdWd('u');
                      LcdWd('n');
                      LcdWd(' ');
                      }
                    
                   }break;
                case 3:
                 
                {  
                  set-=100; //按一次加100
                 if (set<1500)
                  set="4000";
                   }
                  
                   break;
               case 4:
               { 
        //   read_counter();
         //  rIn = sensor ();                //  Read Input
         //  rOut = PIDCalc ( &sPID,rIn );   //  Perform PID Interaction
        //   actuator ( rOut );              //  Effect Needed Changes
              set+=100; //按一次加100
              if (set>4000)
              set="1500";
              }
                 break;
                 }
           }//end keyproc
   //  read_counter();   
     if (read==1)
     {
       read="0";
     if (counter<2) ST  //当有外力时,停止
       sPID.SetPoint=((unsigned int )sPID.SetPoint<<3)/60.0; 
      sPID.SetPoint =set;
      sPID.SetPoint=sPID.SetPoint/60.0;
       rIn = sensor ();                //  Read Input
       rOut = PIDCalc ( &sPID,rIn );   //  Perform PID Interaction
       actuator ( rOut );              //  Effect Needed Changes
       read_counter(); 
     }//end  read
       }//end while
}//end main

/*====================================================================================================
   PID计算部分
=====================================================================================================*/

double PIDCalc( PID *pp, double NextPoint )//NextPOint为下次测量的值
{
    double  Error;
    //dError,
           

       Error = pp->SetPoint - NextPoint;          // 偏差  
         //  Error = NextPoint-pp->SetPoint ;
        //if (Error>3000) ST;
       // pp->SumError += Error;                      // 积分
       // dError = pp->LastError - pp->PrevError;     // 当前微分
        pp->PrevError = pp->LastError;
        pp->LastError = Error;
        return (pp->Proportion *(Error*2.45 -3.0*pp->LastError+1.55 *pp->PrevError)              // 比例项
                     // 积分项
                    // 微分项
        );
}
 
/*====================================================================================================
   Initialize PID Structure
=====================================================================================================*/

void PIDInit (PID *pp)  //定义一下结构类型变量PP
{
    memset ( pp,0,sizeof(PID)); //清空一个结构类型的变量或数组
}

/*====================================================================================================
    Main Program
=====================================================================================================*/

double sensor (void)                    // 接收采集的数据
{  
  // if (counter<30) ST  //当有外力时,停止
    return (counter>>3);
}

void actuator(double rDelta)            // 对接收回来的数进行处理送显示

   ocr="ocr"+rDelta;
  if (TCCR1A==0xc3)  
 
 { 
   OCR1A=ocr;}//  对应着PD5口输出的PWM波,当为0时最大
   if (TCCR1A==0x33)
   {OCR1B=ocr;} 
  if (ocr>1024) ocr="700";
  // if (ocr<300) { ST};//停止
  
 }

/***************定时器0中断进行键盘扫描时间****************/
/***********************************************
interrupt [TIM0_COMP] void timer0_comp_isr(void)
{
// Place your code here
if (++key_stime_counter >=5)//定时10MS
  {
   key_stime_counter = 0;
   key_stime_ok = 1; 
                  }
} */
/********************定时器0寄存初始化*********************/
/**********************************************/
void key_init(void)
{
  //TCCR0|=0x0b;//采用比较模式,256分频   8M/256=31.25K
  //TCNT0|=0x00;
  //OCR0=0x3D;// (61+1)/31.25   =2ms
// Timer(s)/Counter(s) Interrupt(s) initialization
 // TIMSK|=0x01;
 // #asm("sei")   // 开放全局中断
}
/***********************************/
/********函数功能说明***************/
/********键盘功能处理***************/
void key_pro(void)
{
      if (key_stime_ok)    // 10ms到,键处理
          {
             key_stime_ok = 0;
              switch (read_key())   // 调用按键接口程序  
               { case 1:
    { /************键值处理**************/
       PORTA="0X11";   
                   }  break;
                case 2:
                     PORTA="0XFE";
                     break;
                case 3:
                   PORTA="0XF1";
                   break;
               case 4:
                 PORTA="0x55";
                 break;
                 }
                
           }
}

/*************键盘扫描*****************/
/****************************************/

char read_key(void)
{
  char key_press, key_return = 0;
  key_press = key_input;  // 读按键I/O电平,当有键按下时为0,没按下时为1
  switch (key_state)
 {
  case key_state_0:    // 按键初始态
      if (key_press!=0x3c) key_state = key_state_1;// 键被按下,状态转换到键确认态
   break;
  case key_state_1:    // 按键确认态
      if (key_press!=0X3C)    //有键按下
    {
 //key_return = 1;   // 按键仍按下,按键确认输出为"1"
 switch (key_press=key_input)
 {
 case 0x1c:
 key_return=1;    break;
 case 0x2c:
 key_return=2;break;
 case 0x34:
 key_return=3;break;
 case 0x38:
 key_return=4;break;
 }   
 key_state = key_state_2; // 状态转换到键释放态
 }
 else
 key_state = key_state_0; // 按键已抬起,转换到按键初始态
 break;
 case key_state_2:       //键已经释放,确认了有键按下
 if (key_press==0x3c)
 key_state = key_state_0; //按键已释放,转换到按键初始态
 break;
  } 
     return key_return;         //当返回为0时,表示没有键按下,
}

点击此处查看原文 >>

系统分类: 汽车电子   |    用户分类:    |    来源: 原创

评论(0) | 阅读(222)
发表于:2008-2-6 13:31:00
标签:555  

0

迟旧迎新

留下一片地。。。

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类:    |    来源: 原创

评论(0) | 阅读(350)
发表于:2007-12-9 19:18:25
标签:键盘扫描  

0

4*4键盘扫描

                      4*4键盘扫描文档

  今天把4*4键盘的程序从单片机上移植到了NIOS上。

   4*4键盘扫描电路

 

 

程序采用间隔时间进行扫描法,由于键盘的抖动时间为10ms-20ms之间,所以在定时器中加入一个标志位,当定时10ms后,就进入判断,采用类似FPGA的状态机法,进行扫描。有效的避开了抖动。

状态一,判断是否有键按下,有键按下,则转到状态二。

状态二:再进行判断有没键按下,有按下,则进行扫描,进入状态三。没有,则返回状态一。

   状态三: 根据行码,和列码进行判断键值,根据相应的键值执行相应的程序。进入状态四

   状态四: 判断键是否释放,松开,则返回状态一,没有,则在状态四。

首先分为行信号(key4—key7),作为输入端口,用于读取IO口上的电平值,初始时写0

列信号(key0---key3),作为输出端口,为送入扫描信号。

在初始时,将所有的列信号(输出口)(key3—key3)置为低电平,在没有任何键按下时,读取(输入口)key4—key7上的电平值将为1,当任何一个按键按下时,则key4-key7中将会有一行被拉低,则表示有键按下。

这时就开始从key0-key3送入扫描字,进行扫描。扫描字为0111,101111011110

如果在它的输入端口发现一个0值,则就知道了在哪一列上有键按下。没有的话,则扫描字左移,继续扫描。根据行值,列值,来读出键值。

 

根据上面的接口电路。Key7—key0对应着键盘的接口高位到低位。

假如:开始key7-key4作为输入口,由于上拉电阻,则读出的数据为1key0-key3作为输出口,写低电平。当键S4按下时,则Key4电平被拉低,判断出在第一行上有键按下。这时,进行扫描。在key0-key3送入扫描字1110,读取key4-key7口上电平,发现key4上的电平为0,则判断出第四列有键按下。则得出s4键按下。键值为key7:key0=1110 (行码)&1110(列扫描字)==1110 1110以此累推。

 

总结:经过移植几种程比较,这种效率最高。而且占用的时间比较少。不过在NIOS上移植,可以结合FPGA,直接做个4*4键盘扫描控制器,当有键按下时,可以进入中断。这样的话,节省了CPU的时间。当有键按下时,送出键按下标志位。进入中断。读取键值,执行键盘程序。可见NIOS的强大功能,和可配置性,还有很多东西待去学习。

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

*功能: 键盘扫描函数

*说明:

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

unsigned char read_key(void)

{

   unsigned char i;

   unsigned char key_return = 0;

  

   IOWR_ALTERA_AVALON_PIO_DIRECTION(KEY_PIO_BASE,0X0f);

   //高四位作为输入,读取数据,低四位为输出